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

Pourquoi devriez vous migrer vers Symfony3 ?

Pourquoi devriez vous migrer vers Symfony3 ?

Migrer d'une version d'un framework à une autre représente toujours un risque et un coût. Alors que la prochaine version LTS de Symfony3 sortira fin 2017, et que Symfony2 est toujours bien maintenue, pourquoi devrions-nous migrer?

En partant d'exemples concrets, vous comprendez que Symfony3 améliore la "DX" (developer experience) mais également la qualité et la maintenabilité de nos applications.

Ai-je dit que la migration était facile et rapide ? ;)

C9bef243216af3ddcf5c62bfeed46c68?s=128

Mickaël Andrieu

December 06, 2016
Tweet

Transcript

  1. Pourquoi migrer sur Symfony3 ? Mickaël Andrieu @mickael_andrieu https://flic.kr/p/DGCpam

  2. Symfony3 améliore la « developer experience »

  3. « Developer Experience » Les composants se sont améliorés!

  4. Gérer un paiement régulier $form = $this->createFormBuilder() ->add(‘payEvery', DateIntervalType::class, [

    'label' => 'Paiement tous les ...', 'widget' => 'choice', 'placeholder' => [ 'days' => 'Jours' ], 'with_years' => false, 'with_months' => false, 'days' => [ 7 => 7, 15 => 15, 30 => 30 ] ]) ->getForm();
  5. Générer des urls pour les Single Page Applications $routes =

    new RouteCollection(); $routes->add('user_account', new Route('/user/{userId}')); $urlGenerator = new UrlGenerator($routes, new RequestContext()); $changePasswordUrl = $urlGenerator->generate('user_account', [ 'userId' => 1234, '_fragment' => 'change-password', ], true); // "/user/1234#change-password"
  6. Générer des urls pour les Single Page Applications $routes =

    new RouteCollection(); $routes->add('user_account', new Route('/user/{userId}')); $urlGenerator = new UrlGenerator($routes, new RequestContext()); $changePasswordUrl = $urlGenerator->generate('user_account', [ 'userId' => 1234, '_fragment' => 'change-password', ], true); // "/user/1234#change-password" /** * @Route("/user/{userId}", defaults={"_fragment" = "change-password"}, * name="user_change-password") */ public function userChangePasswordAction() { ... }
  7. « Developer Experience » Le Framework est plus simple

  8. Bienvenue aux helpers json() et file() $jwt = new \stdClass();

    $jwt->token = $this->get('jwt_token_generator')->generate(); // Génère une JsonResponse() return $this->json($jwt); $pdfPath = $this->getParameter('dir.downloads').'/symfony3.pdf'; // Force le téléchargement return $this->file($pdfPath); // Ou l'affiche dans le navigateur return $this->file($pdfPath, null, ResponseHeaderBag::DISPOSITION_INLINE);
  9. La Console a subi un sacré lifting

  10. Les commandes ont été réorganisées

  11. Les alias sont devenus des alias

  12. « Developer Experience » L’expérience profite aussi aux développeurs plus

    avancés
  13. Les passes de compilation été améliorées // Symfony2 $container->addCompilerPass(new CustomPass(),

    PassConfig::TYPE_AFTER_REMOVING); // Symfony3 $container->addCompilerPass( new CustomPass(), PassConfig::TYPE_AFTER_REMOVING, 30 );
  14. On peut créer ses propres argument resolvers public function githubAction(GithubEvent

    $event = null) { if (is_null($event)) { return new JsonResponse('[err] event not found.'); } $eventName = strtolower($event->getName()) ; $this->get('event_dispatcher')->dispatch($eventName, $event); return new JsonResponse($event->getStatuses()); }
  15. On peut créer ses propres argument resolvers public function githubAction(GithubEvent

    $event = null) { if (is_null($event)) { return new JsonResponse('[err] event not found.'); } // ... return new JsonResponse($event->getStatuses()); } app.github_resolver.event: class: AppBundle\Event\GitHubEventResolver arguments: ['@app.webhook_resolver', 'foo', 'bar'] tags: - { name: controller.argument_value_resolver, priority: 110 }
  16. « Developer Experience » Les composants se sont améliorés Le

    framework est plus simple L’expérience profite aussi aux Experts
  17. Symfony3 améliore vos applications actuelles

  18. « Software Experience » Vos applications sont administrables grâce aux

    variables d’environnement
  19. Les variables d’environnement depuis Symfony2 <VirtualHost *:80> DocumentRoot "/path/to/symfony_2_app/web" SetEnv

    SYMFONY__DATABASE__USER user SetEnv SYMFONY__DATABASE__PASSWORD secret # … </VirtualHost> doctrine: dbal: # ... password: "%database.password%"
  20. Les variables d’environnement depuis Symfony3 doctrine: dbal: # ... password:

    "%env(DB_PASSWORD)%" # Docker model FROM php:7.0-nginx # Declare environment vars ENV DB_PASSWORD secr3t
  21. « Software Experience » Vos applications complexes sont plus simples

    avec le composant Workflow
  22. Un Workflow décrit toutes les transitions possibles entre états d’un

    processus métier
  23. Décrire un Workflow de vente simpliste product: type: state_machine supports:

    [AppBundle\Entity\Product] places: [in_stock, sold, delivered] transitions: buy: from: in_stock to: sold deliver: from: sold to: delived
  24. Décrire un Workflow de vente simpliste product: type: state_machine supports:

    [AppBundle\Entity\Product] places: [in_stock, sold, delivered] transitions: buy: from: in_stock to: sold deliver: from: sold to: delivered
  25. « Software Experience » Vos applications sont plus performantes avec

    le composant Cache
  26. Le composant Cache en clair Intégré et utilisé par le

    framework
  27. Le composant Cache en clair Intégré et utilisé par le

    framework Stricte implémentation de PSR-6
  28. Le composant Cache en clair Intégré et utilisé par le

    framework Stricte implémentation de PSR-6 La gestion de cache par tags* *Non PSR-6
  29. Les tags rendent le cache facile à manipuler use Symfony\Component\Cache\Adapter\FilesystemAdapter;

    $cache = new FilesystemAdapter(); $productId = '123'; $review = $cache->getItem('reviews-'.$reviewId); $review->set('...'); $review->tag(['reviews', 'products', 'product-'.$productId]); $cache->save($review);
  30. Comment faire plus simple ? // rafraîchir tous les avis

    ? $cache->invalidateTags('reviews'); // rafraîchir tous les produits ? $cache->invalidateTags('products'); // rafraîchir le produit ? $cache->invalidateTags('product-123'); // rafraîchir les produits et les reviews $cache->invalidateTags(['products', 'reviews']);
  31. Comment faire plus simple ? // rafraîchir tous les avis

    ? $cache->invalidateTags('reviews'); // rafraîchir tous les produits ? $cache->invalidateTags('products'); // rafraîchir le produit ? $cache->invalidateTags('product-123'); // rafraîchir les produits et les reviews $cache->invalidateTags(['products', 'reviews']);
  32. Comment faire plus simple ? // rafraîchir tous les avis

    ? $cache->invalidateTags('reviews'); // rafraîchir tous les produits ? $cache->invalidateTags('products'); // rafraîchir le produit ? $cache->invalidateTags('product-123'); // rafraîchir les produits et les reviews $cache->invalidateTags(['products', 'reviews']);
  33. Comment faire plus simple ? // rafraîchir tous les avis

    ? $cache->invalidateTags('reviews'); // rafraîchir tous les produits ? $cache->invalidateTags('products'); // rafraîchir le produit ? $cache->invalidateTags('product-123'); // rafraîchir les produits et les avis ? $cache->invalidateTags(['products', 'reviews']);
  34. « Software Experience » Des applications administrables Mieux architecturées Et

    performantes
  35. Migrer vers Symfony3 améliore l’évolutivité de vos applications

  36. « Upgrade Experience » Tester son code n’a jamais été

    aussi simple
  37. Une version améliorée de PHPUnit est embarquée

  38. De nouvelles fonctions pour mocker le réseau /** * @group

    dns-sensitive */ class MyTest extends \PHPUnit_Framework_TestCase { public function testEmails() { DnsMock::withMockedHosts(['example.com' => [['type' => 'MX']]]); $validator = ... $constraint = new Email(['checkMX' => true]); $result = $validator->validate('foo@example.com', $constraint); // ... }
  39. « Upgrade Experience » Déboguer son code n’a jamais été

    aussi facile
  40. Déboguer une requête AJAX

  41. Déboguer un problème d’authentification

  42. Déboguer un problème d’authentification

  43. « Upgrade Experience » La migration vers Symfony3 est rapide

  44. L’architecture a été repensée Symfony2 Symfony3

  45. Les outils existent pour gérer les dépréciations Simple PHPUnit SensioLabs

    Deprecation-detector Symfony Upgrade Fixer
  46. Le plus gros travail, ce sont les formulaires

  47. « Upgrade Experience » Des applications plus facile à tester

    Plus simples à déboguer Et rapides à migrer
  48. A vous de jouer !