[SymfonyLive Paris] Une année de Symfony

[SymfonyLive Paris] Une année de Symfony

Il s'est passé beaucoup de choses depuis un an ! 52 billets de blog pour vous tenir au courant de toutes les nouveautés, un tas de "pull requests", une nouvelle version majeure, 2 mineurs... Eh bien, je suis sûr que vous avez raté quelque chose. Revenons un peu sur ce qui s'est passé au cours de l'année dernière : nous allons voir et/ou découvrir de belles nouveautés qui sont apparues depuis un an.

34ade09dd3d11004ca8ee4174fd3d6a2?s=128

Sarah KHALIL

April 03, 2018
Tweet

Transcript

  1. @saro0h Une année de Sarah Khalil

  2. None
  3. None
  4. Mais avant de parler features…

  5. • 3 versions (dont une LTS) • 7 branches maintenues

    avec 85 releases (de 2.7 à 4.0) 3.4 3.3 4.0 Quelques chiffres
  6. Quelques chiffres 71 blog posts !

  7. Nouveaux membres de la core team ! Tobias Nyholm (@TobiasNyholm)

    Recipes Michael Cullum (@michaelcullumuk) Security team leader Samuel Roze (@sroze) Composant Messenger
  8. 10 ans de Symfony Live

  9. 10 ans de Symfony Live

  10. Allez on dit "

  11. Allez on dit "

  12. " Serveur subversion " Plateforme de plugins #symfony.com/legacy http://symfony.com/blog/the-end-of-symfony-1

  13. " Symfony Installer http://symfony.com/blog/the-end-of-the-symfony-installer

  14. " Silex http://symfony.com/blog/the-end-of-silex

  15. " Silex http://symfony.com/blog/the-end-of-silex

  16. " La standard edition http://symfony.com/blog/the-end-of-the-symfony-standard-edition composer create-project website/skeleton

  17. " SensioGeneratorBundle http://symfony.com/blog/new-and-improved-generators-for-makerbundle bin/console make:crud bin/console make:form

  18. Allez un peu de code maintenant !

  19. Allez un peu de code maintenant !

  20. None
  21. https://speakerdeck.com/saro0h/symfonycon-cluj-a-year-of-symfony Entre m ars 2017 & novem bre 2017 3.4

    3.3 4.0
  22. Améliorations majeures

  23. Améliorations majeures DX

  24. Améliorations majeures DX En bonus

  25. Améliorations majeures DX En bonus 4.1

  26. Améliorations majeures

  27. Router Workflow Dependency Injection Améliorations majeures : 3 composants

  28. Améliorations majeures Router

  29. Le matching de route 77.7 fois plus rapide ! Améliorations

    majeures https://github.com/symfony/symfony/pull/26059 Benchmark avec : 400 routes statiques (ex : /hello, /hello1…) et 400 routes dynamiques (ex: /hello/{name}) Toutes les expressions régulières sont maintenant combinées dans l’url matcher. Router
  30. Configuration inline Améliorations majeures http://symfony.com/blog/new-in-symfony-4-1-inlined-routing-configuration Avant use Symfony\Component\Routing\Annotation\Route; class BlogController

    extends Controller { /** * @Route( * "/blog/{page}", * name="blog_list", * requirements={"page"="\d+"}, * defaults={"page"="1"}) */ public function list($page) { // ... } } Router
  31. Configuration inline Améliorations majeures http://symfony.com/blog/new-in-symfony-4-1-inlined-routing-configuration Après use Symfony\Component\Routing\Annotation\Route; class BlogController

    extends Controller { /** * @Route("/blog/{page<\d+>?1}", name="blog_list") */ public function list($page) { // ... } } Router
  32. Routes internationalisées Améliorations majeures http://symfony.com/blog/new-in-symfony-4-1-internationalized-routing use Symfony\Component\Routing\Annotation\Route; class ContactController {

    /** * @Route({ * "en": "/send-us-an-email", * "fr": "/envoyez-nous-un-email" * }, name="contact") */ public function send() { // ... } } Router
  33. Routes internationalisées : préfixes Améliorations majeures http://symfony.com/blog/new-in-symfony-4-1-internationalized-routing # config/routes/annotations.yaml site:

    resource: '../src/Controller/' type: annotation prefix: en: '/mailing' fr: '/courriel' Router
  34. Trailing slash Améliorations majeures https://symfony.com/blog/new-in-symfony-4-1-smarter-url-redirections # config/routes.yaml foo_route: path: '/foo'

    controller: App\Controller\DefaultController::foo Avant Après /foo/ 404 NOT FOUND /foo/ 301 MOVED PERMANENTLY /foo Router
  35. Redirections 307 & 308 Améliorations majeures https://symfony.com/blog/new-in-symfony-4-1-307-and-308-redirections route_307: # Temporary

    Redirect # ... defaults: # ... permanent: false keepRequestMethod: true route_308: # Permanent Redirect # ... defaults: # ... permanent: true keepRequestMethod: true # La page a changée définitivement # vers une nouvelle route_301: # Moved Permanently # ... defaults: # ... permanent: true # La page a changé d’endroit temporairement route_302: # Found # ... defaults: # ... permanent: false Router
  36. Améliorations majeures Workflow

  37. Injecter des metadata : cas d’utilisation (1/4) Améliorations majeures https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements

    Cas d’utilisation « J’ai besoin d’injecter une route pour y avoir accès dans : • un workflow • une place • une transition » Workflow
  38. Injecter des metadata : la configuration de mon workflow (2/4)

    https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements Workflow # config/packages/workflow.yaml framework: workflows: my_workflow: supports: - App\Entity\BlogPost metadata: route: ‘une_route' # ... places: some_place: metadata: route: ‘une_autre_route’ # ... transitions: some_transition: metadata: route: ‘une_derniere_route’ Améliorations majeures
  39. Injecter des metadata : Récupérer les metadata (php) (3/4) Améliorations

    majeures https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements $metadataStore = $workflow->getMetadataStore(); // framework.workflows.my_workflow.metadata.route $metadatStore->getWorkflowMetadata()->get(‘route'); // framework.workflows.my_workflow.places.some_place.metadata.route $metadatStore->getPlaceMetadata($place)->get('route'); // framework.workflows.my_workflow.places.some_transistions.metadata.route $metadatStore->getTransitionMetadata($transition)->get('route'); Workflow
  40. Injecter des metadata : Récupérer les metadata (twig) (4/4) Améliorations

    majeures https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements $metadataStore = $workflow->getMetadataStore(); // framework.workflows.my_workflow.metadata.route {{ workflow_metadata(article, ‘route') }} // framework.workflows.my_workflow.places.some_place.metadata.route {{ workflow_metadata(article, 'route', place) }} // framework.workflows.my_workflow.places.some_transistions.metadata.route {{ workflow_metadata(article, 'route', transition) }} Workflow
  41. Transition blocker ou expliquer pourquoi une transition est bloquée https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements#added-transition-blockers

    Améliorations majeures Workflow
  42. use Symfony\Component\Workflow\Event\GuardEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class BlogPostReviewListener implements EventSubscriberInterface { public

    function guardReview(GuardEvent $event) { /** @var \App\Entity\BlogPost $post */ $post = $event->getSubject(); $title = $post->title; if (empty($title)) { $event->setBlocked(true); $event->addTransitionBlocker( new TransitionBlocker( « Impossible de publier cet article, il n'a pas de titre." )); } } public static function getSubscribedEvents() { return array( 'workflow.blogpost.guard.to_review' => array('guardReview'), ); } } https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements#added-transition-blockers Workflow
  43. <h2>Pourquoi vous ne pouvez pas publier cet article ?</h2> <ul>

    {% for transition in workflow_all_transitions(article) %} {% if not workflow_can(article, transition.name) %} <ul> {% for blocker in workflow_build_transition_blocker_list(article, transition.name) %} <li> {{ blocker.message }} </li> {% endfor %} </ul> {% endif %} {% endfor %} </ul> https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements#added-transition-blockers Workflow Améliorations majeures
  44. Améliorations majeures Dependency Injection

  45. Paramètres du container au format CSV Améliorations majeures https://github.com/symfony/symfony/pull/25627 #

    .env MAILING_LIST_ADMIN: a@email.fr,b@email.fr,c@email.fr # config/services.yml services: AppBundle\Service\Mailer: arguments: $bcc: "%env(csv:mailing_list_admin)%" DI
  46. Récupérer les paramètres du container en service Améliorations majeures http://symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service

    namespace AppBundle\Service; class Mailer { private $bcc; public function __construct($bcc) { $this->bcc = $bcc; } } services: AppBundle\Service\Mailer: arguments: $bcc: '%bcc_email_address%' Avant Après namespace AppBundle\Service; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class Mailer { private $params; public function __construct(ParameterBagInterface $params) { $this->params = $params; // $this->params->get('bcc_email_address'); } } + + Autowiring DI
  47. Developer eXperience

  48. DI & test : Accès facilité aux services privés DX

    https://github.com/symfony/symfony/pull/26499 • Si extends Symfony\Bundle\FrameworkBundle\Test\TestContainer $container = static::$kernel->getContainer(); • Si extends Symfony\Bundle\FrameworkBundle\Test\WebTestCase $client = static::createClient(); $client->getContainer();
  49. Console : Surcharger la sortie - texte (1/2) DX https://github.com/symfony/symfony/pull/24363

  50. Console : Surcharger la sortie - texte (1/2) DX https://github.com/symfony/symfony/pull/24363

  51. Console : Surcharger la sortie texte (2/2) DX https://github.com/symfony/symfony/pull/24363 $section1

    = $output->section(); $section2 = $output->section(); $section1->writeln("<comment>Doing something</comment>\n"); usleep(500000); $section2->writeln('<info>Result of first operation</info>'); usleep(500000); $section1-> overwrite("<comment>Doing something else</comment>\n"); usleep(500000); $section2->writeln('<info>Result of second operation</info>'); usleep(500000); $section1-> overwrite("<comment>Finishing</comment>\n"); usleep(500000); $section2->writeln('<info>Last Result</info>');
  52. Console : plusieurs Progress bars (1/2) DX https://github.com/symfony/symfony/pull/24363

  53. Console : plusieurs Progress bars (1/2) DX https://github.com/symfony/symfony/pull/24363

  54. Console : plusieurs Progress bars (2/2) DX https://github.com/symfony/symfony/pull/24363 $section1 =

    $output->section(); $section2 = $output->section(); $progress = new ProgressBar($section1); $progress2 = new ProgressBar($section2); $progress->start(100); $progress2->start(100); $c = 0; while (++$c < 100) { $progress->advance(); if ($c % 2 === 0) { $progress2->advance(4); } usleep(500000); }
  55. Console : Surcharger la sortie - Tableau (1/2) DX https://github.com/symfony/symfony/pull/24363

  56. Console : Surcharger la sortie - Tableau (1/2) DX https://github.com/symfony/symfony/pull/24363

  57. DX https://github.com/symfony/symfony/pull/24363 Console : Surcharger la sortie - Tableau (2/2)

    $section1 = $output->section(); $section2 = $output->section(); $progress = new ProgressBar($section1); $table = new Table($section2); $table->addRow(['Row 1']); $table->render(); $progress->start(5); $c = 0; while (++$c < 5) { $table->appendRow(['Row '.($c + 1)]); $progress->advance(); usleep(500000); } $progress->finish(); $section1->clear();
  58. Et en bonus !

  59. Cache : Supprimer un item bin/console cache:pool:delete <pool> <key> Et

    en bonus ! https://github.com/symfony/symfony/pull/26223
  60. Twig : Priorité dans les extensions http://symfony.com/blog/new-in-symfony-4-1-twig-extensions-priority Et en bonus

    ! Utile pour la surcharge d’un élément Twig. L’extension ayant la priorité la plus élevée est enregistrée en premier. # config/services.yaml services: # ... App\Twig\MyExtension: public: false tags: - { name: twig.extension, priority: 200 }
  61. Lock : Mettre à jour le TTL à jour http://symfony.com/blog/new-in-symfony-4-1-dynamic-lock-refresh

    Et en bonus ! use Symfony\Component\Lock\Factory; use Symfony\Component\Lock\Store\SemaphoreStore; class MyClass { $store = new SemaphoreStore(); $factory = new Factory($store); // TTL à 30 secondes $lock = $factory->createLock('the-lock-name', 30); // ... $lock->acquire(); $lock->refresh(600); // Du traitement plus long… }
  62. Security : AdvancedUserInterface " 1/2 https://symfony.com/blog/new-in-symfony-4-1-deprecated-the-advanceduserinterface Et en bonus !

  63. Security : AdvancedUserInterface " 1/2 https://symfony.com/blog/new-in-symfony-4-1-deprecated-the-advanceduserinterface Et en bonus !

  64. Security : AdvancedUserInterface " 2/2 https://symfony.com/blog/new-in-symfony-4-1-deprecated-the-advanceduserinterface Et en bonus !

    Pourquoi ? Simplifier le Symfony\Component\Security\Core\User\UserChecker
  65. Security : AdvancedUserInterface " 2/2 https://symfony.com/blog/new-in-symfony-4-1-deprecated-the-advanceduserinterface Et en bonus !

    Pourquoi ? Simplifier le Symfony\Component\Security\Core\User\UserChecker Comment faire ? Implémenter son propre UserChecker %
  66. Nouveau composant ! (1/4) Et en bonus ! - Fabien

    Potencier, groupie #
  67. Nouveau composant ! (1/4) Et en bonus ! - Fabien

    Potencier, groupie #
  68. Et en bonus !

  69. Nouveau composant : Messenger (3/4) Et en bonus ! •

    Envoyer / Recevoir des messages depuis / vers : • D’autres applications • Via un système de Queue • AMQP support built-in et beaucoup plus ! • Expérimental ⚠ Pas encore couvert par la politique de rétrocompatibilité https://www.slideshare.net/samuelroze/symfony-messenger-queues-workers-more
  70. Nouveau composant : Messenger (4/4) Et en bonus ! https://github.com/symfony/symfony-docs/pull/9437

  71. None
  72. None
  73. Un dernier mot !

  74. https://github.com/symfony/diversity

  75. Merci ! https://symfony.com/blog/say-thanks-to-the-libraries-you-depend-on

  76. @catlannister Et sinon Lannister va bien

  77. @catlannister Et sinon Lannister va bien