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. @saro0h
    Une année de
    Sarah Khalil

    View Slide

  2. View Slide

  3. View Slide

  4. Mais avant de parler
    features…

    View Slide

  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

    View Slide

  6. Quelques chiffres
    71 blog posts
    !

    View Slide

  7. Nouveaux membres de la core team !
    Tobias Nyholm

    (@TobiasNyholm)
    Recipes
    Michael Cullum

    (@michaelcullumuk)
    Security team leader
    Samuel Roze

    (@sroze)
    Composant Messenger

    View Slide

  8. 10 ans de Symfony Live

    View Slide

  9. 10 ans de Symfony Live

    View Slide

  10. Allez on dit "

    View Slide

  11. Allez on dit "

    View Slide

  12. " Serveur subversion

    " Plateforme de plugins

    #symfony.com/legacy
    http://symfony.com/blog/the-end-of-symfony-1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. Allez un peu de
    code maintenant !

    View Slide

  19. Allez un peu de
    code maintenant !

    View Slide

  20. View Slide

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

    View Slide

  22. Améliorations
    majeures

    View Slide

  23. Améliorations
    majeures
    DX

    View Slide

  24. Améliorations
    majeures
    DX
    En bonus

    View Slide

  25. Améliorations
    majeures
    DX
    En bonus
    4.1

    View Slide

  26. Améliorations
    majeures

    View Slide

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

    View Slide

  28. Améliorations majeures
    Router

    View Slide

  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

    View Slide

  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

    View Slide

  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?1}", name="blog_list")
    */
    public function list($page)
    {
    // ...
    }
    }
    Router

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  36. Améliorations majeures
    Workflow

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  43. Pourquoi vous ne pouvez pas publier cet article ?

    {% for transition in workflow_all_transitions(article) %}
    {% if not workflow_can(article, transition.name) %}

    {% for blocker in workflow_build_transition_blocker_list(article, transition.name) %}

    {{ blocker.message }}

    {% endfor %}

    {% endif %}
    {% endfor %}

    https://symfony.com/blog/new-in-symfony-4-1-workflow-improvements#added-transition-blockers
    Workflow
    Améliorations
    majeures

    View Slide

  44. Améliorations majeures
    Dependency
    Injection

    View Slide

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

    View Slide

  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

    View Slide

  47. Developer
    eXperience

    View Slide

  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();

    View Slide

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

    View Slide

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

    View Slide

  51. Console : Surcharger la sortie texte (2/2)
    DX
    https://github.com/symfony/symfony/pull/24363
    $section1 = $output->section();
    $section2 = $output->section();
    $section1->writeln("Doing something\n");
    usleep(500000);
    $section2->writeln('Result of first operation');
    usleep(500000);
    $section1->
    overwrite("Doing something else\n");
    usleep(500000);
    $section2->writeln('Result of second operation');
    usleep(500000);
    $section1->
    overwrite("Finishing\n");
    usleep(500000);
    $section2->writeln('Last Result');

    View Slide

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

    View Slide

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

    View Slide

  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);
    }

    View Slide

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

    View Slide

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

    View Slide

  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();

    View Slide

  58. Et en bonus !

    View Slide

  59. Cache : Supprimer un item
    bin/console cache:pool:delete
    Et en bonus !
    https://github.com/symfony/symfony/pull/26223

    View Slide

  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 }

    View Slide

  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…
    }

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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 %

    View Slide

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

    View Slide

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

    View Slide

  68. Et en bonus !

    View Slide

  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

    View Slide

  70. Nouveau composant : Messenger (4/4)
    Et en bonus !
    https://github.com/symfony/symfony-docs/pull/9437


    View Slide

  71. View Slide

  72. View Slide

  73. Un dernier mot !

    View Slide

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

    View Slide

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

    View Slide

  76. @catlannister
    Et sinon Lannister va
    bien

    View Slide

  77. @catlannister
    Et sinon Lannister va
    bien

    View Slide