$30 off During Our Annual Pro Sale. View Details »

Symfony Flex in Action

Symfony Flex in Action

This talk was hold on October 27th with Christian Flothmann (@xabbuh) at SymfonyLive in Berlin.

Symfony Flex is a revolution in the world of Symfony and changes the way of building applications. A developer needs to focus more on dependencies, but can easily increase productivity and lower the footprint of an application. We accompanied Symfony on the way to the new Flex era and will give you concrete examples how application development now looks like and explain the key concepts.

Christopher Hertel

October 27, 2017
Tweet

More Decks by Christopher Hertel

Other Decks in Programming

Transcript

  1. SensioLabs
    Flex in
    Action

    View Slide

  2. SensioLabs
    Who are we?

    View Slide

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

    View Slide

  4. SensioLabs
    Diving into Flex

    View Slide

  5. ©Adobe Systems Software

    View Slide

  6. ©Apache Software Foundation

    View Slide

  7. ©Bosch Media Service

    View Slide

  8. SensioLabs
    Symfony Flex

    View Slide

  9. Why Flex?

    View Slide

  10. applications based on
    Standard Edition

    View Slide

  11. 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

    View Slide

  12. massive
    dependency graph

    View Slide

  13. hard to customize

    View Slide

  14. redundant steps to
    install bundles

    View Slide

  15. Flex to the rescue!

    View Slide

  16. start clean

    View Slide

  17. composition
    over
    inheritance

    View Slide

  18. know your
    dependencies

    View Slide

  19. automation

    View Slide

  20. The Schedule

    View Slide

  21. Symfony Flex
    can already be used

    View Slide

  22. We are here

    View Slide

  23. Symfony 3.4
    end of November

    View Slide

  24. Symfony 3.4
    =
    Symfony 3.3
    +
    new features
    +
    new deprecations

    View Slide

  25. Symfony 4
    at the same time

    View Slide

  26. Symfony 4.0
    =
    Symfony 3.4
    -
    deprecated features

    View Slide

  27. Symfony 4 != Flex

    View Slide

  28. Flex usable
    with Symfony 3.3

    View Slide

  29. Symfony 4 usable
    without Flex

    View Slide

  30. PHP Requirements
    Flex 7.0.8
    Symfony 4 7.1.3

    View Slide

  31. SensioLabs
    Hands on

    View Slide

  32. Installation

    View Slide

  33. Symfony Installer

    View Slide

  34. Flex is a
    Composer Plugin

    View Slide

  35. Hooks into
    Composer‘s lifecycle

    View Slide

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

    View Slide

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

    View Slide

  38. Standard Edition

    View Slide

  39. Anatomy

    View Slide

  40. Initial size decreases

    View Slide

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

    View Slide

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

    View Slide

  43. Directory Structure

    View Slide

  44. .
    |─ 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

    View Slide

  45. 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

    View Slide

  46. 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

    View Slide

  47. 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

    View Slide

  48. Config Directory

    View Slide

  49. 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
    |-…

    View Slide

  50. 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

    View Slide

  51. 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

    View Slide

  52. 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

    View Slide

  53. 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

    View Slide

  54. 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

    View Slide

  55. 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

    View Slide

  56. 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

    View Slide

  57. 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

    View Slide

  58. bundles.php
    return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    ];
    return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
    ];
    return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
    Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
    ];
    return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['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],
    ];
    return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['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],
    ];

    View Slide

  59. SensioLabs
    Insides

    View Slide

  60. Recipes

    View Slide

  61. actions performed on
    package installation

    View Slide

  62. reviewed and maintained
    by core team

    View Slide

  63. automatically
    executed

    View Slide

  64. available only for
    selected packages

    View Slide

  65. {
    "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

    View Slide

  66. View Slide

  67. What about
    other packages?

    View Slide

  68. Contrib Recipes

    View Slide

  69. maintained by the
    community

    View Slide

  70. not applied
    automatically

    View Slide

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

    View Slide

  72. Interactive activation

    View Slide

  73. SensioLabs
    Example Apps

    View Slide

  74. Mailing Service

    View Slide

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

    View Slide

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

    View Slide

  77. 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 }

    View Slide

  78. 3. Mailer (Domain)

    View Slide

  79. 4. Controller (Framework)

    View Slide

  80. 5. Testing

    View Slide

  81. Product Import

    View Slide

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

    View Slide

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

    View Slide

  84. 3. Entity

    View Slide

  85. 4. Importer

    View Slide

  86. 5. Command

    View Slide

  87. 6. Testing

    View Slide

  88. SensioLabs
    Recap

    View Slide

  89. more automated
    development workflow

    View Slide

  90. better
    dependency
    control

    View Slide

  91. smaller footprint

    View Slide

  92. increased productivity
    while shaping your apps

    View Slide

  93. Thank you!

    View Slide

  94. See you @ Hackathon
    19.00 pm – 11th floor

    View Slide

  95. Feedback?
    joind.in/talk/ce4b4

    View Slide

  96. View Slide

  97. Questions?

    View Slide

  98. View Slide