Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Symfony 4 in action (updated for 4.3)

Symfony 4 in action (updated for 4.3)

Fabien Potencier

April 26, 2019
Tweet

More Decks by Fabien Potencier

Other Decks in Technology

Transcript

  1. What is Symfony 4? A new developer experience On a

    rock solid foundation From micro-style to monolith
  2. 5

  3. $ symfony new demo # Want to try Symfony 4.3

    (dev version)? $ symfony new demo --version=dev-master
  4. 7

  5. symfony/skeleton "require": { "php": "^7.1.3", "ext-ctype": "*", "ext-iconv": "*", "symfony/console":

    "*", "symfony/dotenv": "*", "symfony/flex": "^1.1", "symfony/framework-bundle": "*", "symfony/yaml": "*" },
  6. $ symfony new demo --version=dev-master --debug Demo "scripts": { "auto-scripts":

    { "cache:clear": "symfony-cmd", "assets:install %PUBLIC_DIR%": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" ] },
  7. $ tree -I vendor $ find . -type f |

    wc -l Symfony 4 is lightweight Only 16 files vs 31 SE 3300 total vs 8867 SE -65%
  8. New directory structure • Less depth, easier to navigate •

    Non-PHP files in their own directories (assets/, templates/) • Decoupled from Symfony (assets/, src/, templates/, public/)
  9. Symfony 2+/3+ Monolog Bundle SwiftMailer Bundle Polyfill Util Polyfill PHP

    7.0 Polyfill PHP 5.6 Polyfill Mbstring Polyfill Intl ICU Polyfill APCu PHPUnit Bridge Debug Bundle Framework Bundle Security Bundle Twig Bundle WebProfiler Bundle WebServer Bundle Doctrine Bridge Monolog Bridge Twig Bridge Monolog Doctrine (11) SecurityChecker Generator Bundle ParamHandler FrameworkExtra Bundle Distribution Bundle Asset BrowserKit Cache ClassLoader Config Console CssSelector Debug DependencyInjection DomCrawler Dotenv EventDispatcher ExpressionLanguage Filesystem Finder Form HttpFoundation HttpKernel Inflector Intl Ldap OptionsResolver Process PropertyAccess PropertyInfo Routing Security Serializer Stopwatch Templating Translation Validator VarDumper WebLink Workflow Yaml 4 bridges 15 librairies 11 bundles 42 components SwiftMailer
  10. Symfony 4+ Polyfill Mbstring Framework Bundle Cache Config Debug DependencyInjection

    Dotenv EventDispatcher Filesystem Finder HttpFoundation HttpKernel Routing Yaml 0 bridges 1 library 1 bundle 13 components Flex
  11. Aliases • Shortcuts for common packages (log, behat, phpunit, …)

    • Optimized for Symfony Components (no need to use the symfony/ prefix, just workflow, dom-crawler, …) • Opinionated choices (admin, api, orm, mailer, test, …)
  12. Packs • Bundle several dependencies into a consistent set (debug,

    profiler, api, test, …) $ composer req debug
  13. Adding a Twig Extension Where do I store the Twig

    extension class? Which file do I need to change to register it? Which tag do I need to use? How do I declare a tag in YAML? Which interface/class do I need to implement/ extend? It’s too complex. What about doing it the dirty way and do it in the controller instead? hmm, ok
  14. Full Automation works for… • Twig extensions • Event listeners

    • Doctrine repositories • Commands • Voters • Registration form system • …
  15. Beyond “Hello World” • Defining some models via Doctrine •

    Adding an API for my model • Managing data with an admin
  16. $ composer req symfony/mailer Symfony Maker Bundle use Symfony\Component\Mailer\MailerInterface; public

    function index(MailerInterface $mailer) { $mailer->send( (new Email()) ->from('[email protected]') ->to('[email protected]') ->subject('Some subject') ->text('Some text...') ); MAILER_DSN=smtp://localhost
  17. Symfony Maker Bundle use Symfony\Component\Mailer\MailerInterface; public function index(MailerInterface $mailer) {

    $mailer->send( (new TemplatedEmail()) ->from('[email protected]') ->to('[email protected]') ->subject('Some subject') ->htmlTemplate('@emails/welcome.html.twig') ->context([ 'city' => 'Tunis' ]) ); MAILER_DSN=smtp://localhost
  18. $ composer req twig/inky-extension Symfony Maker Bundle MAILER_DSN=smtp://localhost {% apply

    inky|inline_css(source("@zurb/stylesheets/main.css")) %} <container> <row class="header"> <columns> <spacer size="16"></spacer> <h4 class="text-center">Symfony Connect</h4> </columns> </row> <row> <columns> <spacer size="32"></spacer> <center><img width="100px" src="{{ email.image("@images/symfony.png") }}"></center> <spacer size="16"></spacer> <h1 class="text-center">Forgot Your Password?</h1> <spacer size="16"></spacer> <p class="text-center">It happens. Click the link below to reset it.</p> <button class="large expand" href="#">Reset Password</button> <hr/> <p><small><center><a href="#">unsubscribe here</a>.</small></center></p> </columns> </row> </container> {% endapply %}
  19. I want to send rich and responsive emails
 from my

    controller
 via my provider's API
  20. I want to send rich and responsive emails
 from my

    controller
 via my provider's API
 asynchronously
  21. $ composer req messenger framework: messenger: transports: email: "doctrine://default" routing:

    Symfony\Component\Mailer\Messenger\SendEmailMessage: email $ ./bin/console messenger:consume Symfony Maker Bundle
  22. I want to send rich and responsive emails
 from my

    controller
 via my provider's API
 asynchronously with AMQP
  23. $ composer req messenger framework: messenger: transports: email: "amqp://guest:guest@localhost:5672/%2f/messages" routing:

    Symfony\Component\Mailer\Messenger\SendEmailMessage: email $ ./bin/console messenger:consume Symfony Maker Bundle
  24. Symfony 4 recap • Auto-configuration for any Composer package •

    A Maker bundle to simplify creating files • No boilerplate code, just business logic • Controllers and commands as services • From micro to monolith • Meta-packages doing a lot for you out of the box Productivity boost! Better DX
  25. $ composer require symfony/console Truly independent components (new Console\Application('echo', '1.0.0'))

    ->register('echo') ->addArgument('foo', Console\Input\InputArgument::OPTIONAL, 'The directory') ->addOption('bar', null, Console\Input\InputOption::VALUE_REQUIRED) ->setCode(function(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) { // output arguments and options }) ->getApplication() ->setDefaultCommand('echo', true) // Single command application ->run();
  26. • CssSelector • Debug • Dotenv • Finder • Mailer

    • Mime • sMessenger • Polyfill : APCu, ctype, iconv, intl, mbstring, PHP, … • Process • VarDumper • VarExporter • Yaml • … Truly independent components
  27. Predictable releases and support https://symfony.com/releases •Every month: a patch release

    •Every 6 month: a minor release •Every 2 years: a major release •On the go: security releases
  28. Predictable releases and support Release end of support +8 months

    +14 months +36 months +48 months end of security support end of security support end of support Standard Releases (3.3, 4.0) LTS Releases (2.8, 3.4)
  29. Stability and predictability • Strict semantic versioning • Deprecation/BC policy

    • Responsible security issue management https://symfony.com/bc https://symfony.com/security
  30. Scale from micro to monolith 13 files 15 dependencies start

    with … and grow as you see fit via automation
  31. Community oriented • Code of conduct
 https://symfony.com/conduct • Enforced by

    the CARE team
 https://symfony.com/care • Respectful Review Comments
 https://symfony.com/doc/current/contributing/community/review-comments.html Diversity initiative
 https://symfony.com/diversity