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.

Avatar for Sarah KHALIL

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