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

Symfony 4: A new way to develop applications #phpsrb

Symfony 4: A new way to develop applications #phpsrb

Symfony4 is here and it is better than ever. With Flex it can be a micro framework and an amazing beast with any feature you want. What changed from version 3, what are new best practices, what are new components and why Symfony is moving PHP world forward once again you can find in this talk.

Antonio Peric-Mazar

May 26, 2019

More Decks by Antonio Peric-Mazar

Other Decks in Programming


  1. Symfony4: a new way to develop applications Antonio Perić-Mažar, Locastic

    26.05.2019 - #phpsrb
  2. Antonio Perić-Mažar CEO @ Locastic Co-founder @ Tinel Meetup Co-founder

    @ Blockada t: antonioperic m: antonio@locastic.com
  3. Locastic Helping clients create web and mobile apps since 2011

    • UX/UI • Mobile apps • Web apps • Training & Consulting www.locastic.com @locastic
  4. None
  5. None
  6. None
  7. 2005.

  8. php 5.3 2009. 2005.

  9. php 5.3 2009. 2005. 2015.

  10. php 5.3 2009. 2005. 2015. Nov 2017.

  11. None
  12. • Installing bundle is too cumbersome • Remove bundle is

    too cumbersome • The standard edition is not good enough • You always had a feeling that you have a bunch of code and packages that your are not using What we can do better?
  13. – Fabien Potencier “As a developer, I want to start

    small, without too many dependencies. But I also want to be able to grow my application as I see fit. From a micro-framework style app to a gigantic monolith. Your choice. The framework should not get in the way.”
  14. Composition over inheritance

  15. • Starting as micro framework • Compose your application •

    Build anything you want; console app, traditional web app, etc • Based on a micro-kernel and contain 70% less code and files than new Symfony 3 apps Symfony4
  16. None
  17. Composer started as a conversation about how to generically install

    bundles/plugins/extensions for Symfony and phpBB. Fun fact
  18. Composer started as a conversation about how to generically install

    bundles/plugins/extensions for Symfony and phpBB. Fun fact Neither Symfony nor phpBB uses Composer as a way to install its bundles/plugins/extensions. WTF fact
  19. • Composer plugin • Auto-configurable via recipes • Official and

    private recipes Symfony Flex
  20. None
  21. Decide which package to install Run any task to configure

  22. { "bundles": { "Symfony\\Bundle\\SwiftmailerBundle\\SwiftmailerBundle": ["all"] }, "copy-from-recipe": { "config/": "%CONFIG_DIR%/"

    }, "env": { "#1": "For Gmail as a transport, use: \"gmail:// username:password@localhost\"", "#2": "For a generic SMTP server, use: \"smtp://localhost: 25?encryption=&auth_mode=\"", "#3": "Delivery is disabled by default via \"null:// localhost\"", "MAILER_URL": "null://localhost" }, "aliases": ["mailer", "mail"] } Symfony mailer recipe
  23. • Two repositories • symfony/recipies • maintained by Symfony core

    team, contains only recipies for components and bundles ‘opinionated’ by core team • can use alias • symfony/recipies-contrib • anyone can contribute • cannot use alias Symfony Flex Recipies
  24. https://flex.symfony.com/

  25. None
  26. • With composer • composer create-project symfony/skeleton • composer create-project

    symfony/website-skeleton • composer create-project symfony/demo Starting a new project
  27. • With Symfony Client • Helps you create new Symfony

    applications • supports multiple PHP versions, different PHP config per directory • Provides a local HTTP/2 web server • Generates TLS certificates • Checks for security vulnerabilities • Seamlessly integrates with SymfonyCloud • Works on Windows also Starting a new project
  28. • With Symfony Client • symfony new my_project • symfony

    new ——full my_poject • symfony serve Starting a new project
  29. None
  30. Configuration

  31. No more different controllers for different enviroments

  32. Your code goes here

  33. Cache, log…

  34. vendors

  35. .env variables

  36. symfony.lock is used by flex to track which recipies are

    installed in the project
  37. • parameters.yaml is gone • more flexible but still you

    need to care about security • .env - commit - defaults • .env.local - gitignore • .env.test - commit - defaults • .env.test.local - gitignore .env
  38. Don’t put secrets in .env file!!!

  39. • Bundle vs no-bundle apps • All in src/ folder

    • App/ namespace • You should separate, but no need for bundles • Moving forward to standardisation • Reduces the perceived complexity, makes your code feels more decoupled from symfony • Bundle inheritance mechanisms are depricated in 3.4, removed in 4.0 Bundle-less applications
  40. Say hi to autowiring

  41. • Introduced in Symfony3 • Allows you to manage services

    in the container with minimal configuration • Reads type-hints on your constructor (or other methods) and automatically passes the correct services • Designed to be predictable; if it is not absolutely clear which dependency should be passed, you will see actionable exception Autowiring
  42. # This file is the entry point to configure your

    own services. # Files in the packages/ subdirectory configure your dependencies. # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration parameters: services: # default configuration for services in *this* file _defaults: autowire: true # Automatically injects dependencies in your services. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name App\: resource: '../src/*' exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class App\Controller\: resource: '../src/Controller' tags: ['controller.service_arguments'] # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones
  43. By default, all services are now private. $container->get(‘service_name’) is dead

  44. <?php namespace App\Service; use App\Util\Rot13Transformer; class TwitterClient { private $transformer;

    public function __construct(Rot13Transformer $transformer) { $this->transformer = $transformer; } public function tweet($user, $key, $status) { $transformedStatus = $this->transformer->transform($status); // ... connect to Twitter and send the encoded status } }
  45. bin/console debug:autowiring

  46. • Webpack Encore is a simpler way to integrate Webpack

    into your application • Step forward after AsseticBundle • composer require webpack-encore • Works outside of Symfony Symfony Webpack Encore
  47. None
  48. None
  49. • Symfony on PHP 7.2 makes your code quite a

    bit faster than 7.1 • Symfony 2.3 is the second fastest Symfony release since 2.0 • Symfony 3.4 is the slowest release since 2.0 (deprecated features are probably one of the reasons); • Symfony 4.0 is almost three times faster as Laravel 5.5. Performance
  50. Stability and predictability

  51. • It is possible, not so complex (depending on project)

    • It will take a little bit of time • Upgrade first to Symfony 3.4 Updating to Symfony4
  52. None
  53. Keep cooding features! Symfony4 spirit

  54. • It is a great feeling working with Symfony4 •

    Symfony has great community that is moving framework forward • Flex is amazing thing • New folder structure is more organised and more natural • Better standardisation A year later
  55. • Symfony is great as microframework • Higher level of

    abstraction is better for prototyping and building things faster • Very easy to start, but maybe new developers will think there is to much magic • Symfony as framework should not be a limitation for you A year later
  56. Thank you!

  57. Questions? Antonio Perić-Mažar t: antonioperic m: antonio@locastic.com