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

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

Sarah KHALIL

April 03, 2018
Tweet

More Decks by Sarah KHALIL

Other Decks in Technology

Transcript

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

    avec 85 releases (de 2.7 à 4.0) 3.4 3.3 4.0 Quelques chiffres
  2. Nouveaux membres de la core team ! Tobias Nyholm (@TobiasNyholm)

    Recipes Michael Cullum (@michaelcullumuk) Security team leader Samuel Roze (@sroze) Composant Messenger
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. <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
  14. Paramètres du container au format CSV Améliorations majeures https://github.com/symfony/symfony/pull/25627 #

    .env MAILING_LIST_ADMIN: [email protected],[email protected],[email protected] # config/services.yml services: AppBundle\Service\Mailer: arguments: $bcc: "%env(csv:mailing_list_admin)%" DI
  15. 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
  16. 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();
  17. 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>');
  18. 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); }
  19. 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();
  20. Cache : Supprimer un item bin/console cache:pool:delete <pool> <key> Et

    en bonus ! https://github.com/symfony/symfony/pull/26223
  21. 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 }
  22. 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… }
  23. 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 %
  24. 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