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

Mickaël Andrieu

December 06, 2016
Tweet

More Decks by Mickaël Andrieu

Other Decks in Programming

Transcript

  1. 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();
  2. 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"
  3. 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() { ... }
  4. 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);
  5. 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 );
  6. 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()); }
  7. 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 }
  8. « Developer Experience » Les composants se sont améliorés Le

    framework est plus simple L’expérience profite aussi aux Experts
  9. 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%"
  10. 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
  11. 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
  12. 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
  13. Le composant Cache en clair Intégré et utilisé par le

    framework Stricte implémentation de PSR-6
  14. 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
  15. 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);
  16. 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']);
  17. 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']);
  18. 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']);
  19. 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']);
  20. 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('[email protected]', $constraint); // ... }
  21. « Upgrade Experience » Des applications plus facile à tester

    Plus simples à déboguer Et rapides à migrer