Slide 1

Slide 1 text

SensioLabs Flex in Action

Slide 2

Slide 2 text

SensioLabs Who are we?

Slide 3

Slide 3 text

Christopher Hertel Software Developer at SensioLabs Symfony User Group Berlin @el_stoffel Christian Flothmann Software Developer at SensioLabs Symfony Docs & Core Team @xabbuh

Slide 4

Slide 4 text

SensioLabs Diving into Flex

Slide 5

Slide 5 text

©Adobe Systems Software

Slide 6

Slide 6 text

©Apache Software Foundation

Slide 7

Slide 7 text

©Bosch Media Service

Slide 8

Slide 8 text

SensioLabs Symfony Flex

Slide 9

Slide 9 text

Why Flex?

Slide 10

Slide 10 text

applications based on Standard Edition

Slide 11

Slide 11 text

symfony/asset symfony/browser-kit symfony/cache symfony/config symfony/console symfony/css-selector symfony/dependency-injection symfony/debug symfony/debug-bundle symfony/doctrine-bridge symfony/dom-crawler depends on symfony/symfony

Slide 12

Slide 12 text

massive dependency graph

Slide 13

Slide 13 text

hard to customize

Slide 14

Slide 14 text

redundant steps to install bundles

Slide 15

Slide 15 text

Flex to the rescue!

Slide 16

Slide 16 text

start clean

Slide 17

Slide 17 text

composition over inheritance

Slide 18

Slide 18 text

know your dependencies

Slide 19

Slide 19 text

automation

Slide 20

Slide 20 text

The Schedule

Slide 21

Slide 21 text

Symfony Flex can already be used

Slide 22

Slide 22 text

We are here

Slide 23

Slide 23 text

Symfony 3.4 end of November

Slide 24

Slide 24 text

Symfony 3.4 = Symfony 3.3 + new features + new deprecations

Slide 25

Slide 25 text

Symfony 4 at the same time

Slide 26

Slide 26 text

Symfony 4.0 = Symfony 3.4 - deprecated features

Slide 27

Slide 27 text

Symfony 4 != Flex

Slide 28

Slide 28 text

Flex usable with Symfony 3.3

Slide 29

Slide 29 text

Symfony 4 usable without Flex

Slide 30

Slide 30 text

PHP Requirements Flex 7.0.8 Symfony 4 7.1.3

Slide 31

Slide 31 text

SensioLabs Hands on

Slide 32

Slide 32 text

Installation

Slide 33

Slide 33 text

Symfony Installer

Slide 34

Slide 34 text

Flex is a Composer Plugin

Slide 35

Slide 35 text

Hooks into Composer‘s lifecycle

Slide 36

Slide 36 text

$ composer create-project \ symfony/skeleton my-app New applications $ composer create-project \ symfony/skeleton my-app

Slide 37

Slide 37 text

Symfony 4 Beta $ composer create-project \ symfony/skeleton:^4.0@beta my-app

Slide 38

Slide 38 text

Standard Edition

Slide 39

Slide 39 text

Anatomy

Slide 40

Slide 40 text

Initial size decreases

Slide 41

Slide 41 text

$ symfony new my-app $ du –sh my-app 53M my-app $ cloc my-app 652.336 LOC Standard Edition

Slide 42

Slide 42 text

$ composer create symfony/skeleton my-app $ du –sh my-app 14M my-app $ cloc my-app 135.726 LOC Flex

Slide 43

Slide 43 text

Directory Structure

Slide 44

Slide 44 text

. |─ app/ │ |─ config/ | | |─ config.yml | | └─ parameters.yml | |─ Resources/ | | └─ views/ | └─ AppKernel.php |─ bin/ | └─ console |─ src/ │ └─ AppBundle/ │ └─ Controller/ |─ var/ |─ vendor/ |─ web/ | |─ app.php | └─ app_dev.php └─ composer.json/lock Symfony Standard Application Config Infrastructure Config Templates Kernel Console Application Source /var DocRoot FrontController Composer

Slide 45

Slide 45 text

Symfony Standard Flex . |─ bin/ | └─ console |─ config/ │ |─ packages/ | |─ bundles.php |─ src/ │ |─ Controller/ | └─ Kernel.php |─ templates/ |─ public/ | └─ index.php |─ var/ |─ vendor/ |─ .env └─ composer.json/lock . |─ app/ │ |─ config/ | | |─ config.yml | | └─ parameters.yml | |─ Resources/ | | └─ views/ | └─ AppKernel.php |─ bin/ | └─ console |─ src/ │ └─ AppBundle/ │ └─ Controller/ |─ var/ |─ vendor/ |─ web/ | |─ app.php | └─ app_dev.php └─ composer.json/lock

Slide 46

Slide 46 text

Symfony Standard Flex . |─ bin/ | └─ console |─ config/ │ |─ bundles.php | |─ packages/ |─ src/ │ |─ Controller/ | └─ Kernel.php |─ templates/ |─ translations/ |─ public/ | └─ index.php |─ var/ |─ vendor/ |─ .env └─ composer.json/lock . |─ app/ │ |─ config/ | | |─ config.yml | | └─ parameters.yml | |─ Resources/ | | └─ views/ | └─ AppKernel.php |─ bin/ | └─ console |─ src/ │ └─ AppBundle/ │ └─ Controller/ |─ var/ |─ vendor/ |─ web/ | |─ app.php | └─ app_dev.php └─ composer.json/lock |─ translations/ Translations

Slide 47

Slide 47 text

Symfony Standard Flex . |─ assets/ |─ bin/ | └─ console |─ config/ │ |─ bundles.php | |─ packages/ |─ src/ │ |─ Controller/ | └─ Kernel.php |─ templates/ |─ public/ │ |─ build/ | └─ index.php |─ var/ |─ vendor/ |─ .env └─ composer.json/lock . |─ app/ │ |─ config/ | | |─ config.yml | | └─ parameters.yml | |─ Resources/ | | └─ views/ | └─ AppKernel.php |─ bin/ | └─ console |─ src/ │ └─ AppBundle/ │ └─ Controller/ |─ var/ |─ vendor/ |─ web/ | |─ app.php | └─ app_dev.php └─ composer.json/lock |─ assets/ │ |─ build/ Webpack Encore

Slide 48

Slide 48 text

Config Directory

Slide 49

Slide 49 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-…

Slide 50

Slide 50 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Bundle Configuration

Slide 51

Slide 51 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Environment Specific Configuration

Slide 52

Slide 52 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Infrastructure Specific Configuration

Slide 53

Slide 53 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Routing

Slide 54

Slide 54 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Environment Specific Routing

Slide 55

Slide 55 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Security Configuration

Slide 56

Slide 56 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… Container Configuration

Slide 57

Slide 57 text

Symfony Standard Flex . |─ config/ │ |─ packages/ | | |─ dev/ | | |─ prod/ | | |─ test/ | | |─ doctrine.yaml | | |─ framework.yaml | | └─ security.yaml │ |─ routes/ | | └─ dev/ | | └─ twig.yaml │ |─ bundles.php │ |─ routes.yaml | └─ services.yaml |─ .env |─ .env.dist |─ ... . |-app/ │ |-config/ | | |-config.yml | | |-config_dev.yml | | |-config_prod.yml | | |-config_test.yml | | |-parameters.yml | | |-parameters.yml.dist | | |-routing.yml | | |-routing_dev.yml | | |-security.yml | | └-services.yml |-… bundles.php

Slide 58

Slide 58 text

bundles.php ['all' => true], ]; ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], ]; ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], ]; ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\DebugBundle\DebugBundle::class =>['dev'=>true, 'test'=>true], ]; ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\DebugBundle\DebugBundle::class =>['dev'=>true, 'test'=>true], Symfony\Bundle\WebserverBundle\WebserverBundle::class => ['dev' => true], ];

Slide 59

Slide 59 text

SensioLabs Insides

Slide 60

Slide 60 text

Recipes

Slide 61

Slide 61 text

actions performed on package installation

Slide 62

Slide 62 text

reviewed and maintained by core team

Slide 63

Slide 63 text

automatically executed

Slide 64

Slide 64 text

available only for selected packages

Slide 65

Slide 65 text

{ "bundles": { "Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle": ["all"] }, "copy-from-recipe": { "config/": "%CONFIG_DIR%/", "public/": "%PUBLIC_DIR%/", "src/": "%SRC_DIR%/" }, "composer-scripts": { "cache:clear": "symfony-cmd", "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd" }, "env": { "APP_ENV": "dev", "APP_DEBUG": "1", "APP_SECRET": "%generate(secret)%" }, "gitignore": [ ".env", "/public/bundles/", "/var/", "/vendor/" ] } Example: symfony/framework-bundle

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

What about other packages?

Slide 68

Slide 68 text

Contrib Recipes

Slide 69

Slide 69 text

maintained by the community

Slide 70

Slide 70 text

not applied automatically

Slide 71

Slide 71 text

{ "extra": { "symfony": { "id": "01BX217DNRHSWETJFT83M3XDE9", "allow-contrib": } } } false

Slide 72

Slide 72 text

Interactive activation

Slide 73

Slide 73 text

SensioLabs Example Apps

Slide 74

Slide 74 text

Mailing Service

Slide 75

Slide 75 text

Feature Requirements • JSON Endpoints per mailing • Sending HTML mails • Mail spooling

Slide 76

Slide 76 text

1. Create project $ composer create-project \ symfony/skeleton:^4.0@beta \ flex-mailer $ composer require \ logger annotations mailer twig

Slide 77

Slide 77 text

2. Configuration # config/packages/swiftmailer.yaml swiftmailer: url: '%env(MAILER_URL)%' spool: path: '%kernel.project_dir%/var/mailing-spool' # config/routes.yaml controllers: resource: ../src/Controller/ type: annotation defaults: { _format: json }

Slide 78

Slide 78 text

3. Mailer (Domain)

Slide 79

Slide 79 text

4. Controller (Framework)

Slide 80

Slide 80 text

5. Testing

Slide 81

Slide 81 text

Product Import

Slide 82

Slide 82 text

Feature Requirements • Command line tool • Parse CSV file • Persist products in database

Slide 83

Slide 83 text

1. Create project $ composer create-project \ symfony/skeleton:^4.0@beta \ flex-importer $ composer require logger orm

Slide 84

Slide 84 text

3. Entity

Slide 85

Slide 85 text

4. Importer

Slide 86

Slide 86 text

5. Command

Slide 87

Slide 87 text

6. Testing

Slide 88

Slide 88 text

SensioLabs Recap

Slide 89

Slide 89 text

more automated development workflow

Slide 90

Slide 90 text

better dependency control

Slide 91

Slide 91 text

smaller footprint

Slide 92

Slide 92 text

increased productivity while shaping your apps

Slide 93

Slide 93 text

Thank you!

Slide 94

Slide 94 text

See you @ Hackathon 19.00 pm – 11th floor

Slide 95

Slide 95 text

Feedback? joind.in/talk/ce4b4

Slide 96

Slide 96 text

No content

Slide 97

Slide 97 text

Questions?

Slide 98

Slide 98 text

No content