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

Symfony 4

Symfony 4

Une nouvelle expérience de développement

Titouan Galopin

June 19, 2018
Tweet

More Decks by Titouan Galopin

Other Decks in Programming

Transcript

  1. Symfony 4 Symfony 4 = Symfony 3.4 sans la couche

    de compatibilité … … mais aussi bien plus que ca ! 5
  2. Symfony 4 Réévaluation de toutes les idées de Symfony pour

    les adapter au développement en 2018 6
  3. Symfony 4 Réévaluation de toutes les idées de Symfony pour

    les adapter au développement en 2018 Plus facile à apprendre / configurer / utiliser / déployer Framework PHP le plus rapide du marché 7 phpbenchmarks.com
  4. Symfony 4 PHP 7.1+ Migration 3 => 4 simplifiée par

    le système de dépréciations 8
  5. 9 ├── bin/console ├── config │ ├── bundles.php │ ├──

    packages │ │ ├── dev/routing.yaml │ │ ├── framework.yaml │ │ ├── routing.yaml │ │ └── test/framework.yaml │ ├── routes.yaml │ └── services.yaml ├── public/index.php └── src ├── Controller └── Kernel.php Nouvelle structure Projet vide : - 13 fichiers - 4 dépendances directes
  6. 11

  7. Sans Flex - composer require bundle - Ajouter une ligne

    dans app/AppKernel.php - Créer la configuration dans app/config/config.yml - Importer le routing dans app/config/routing.yml Installation d’un bundle Avec Flex - composer require bundle 13
  8. 15

  9. 18

  10. Symfony Flex Besoin d’une API ? composer require api Besoin

    d’une interface d’admin ? composer require admin 20
  11. Symfony Flex Système de “recettes” : Décrit comment un package

    doit être configuré https://symfony.sh 2 types : officielles et contrib 22
  12. 24

  13. Le maker bundle Un générateur qui fait bien les choses

    27 make:auth make:command make:controller make:crud make:entity make:fixtures make:form make:functional-test make:migration make:serializer:encoder make:subscriber make:twig-extension make:unit-test make:validator make:voter
  14. 28

  15. Deux types de cache 31 Cache système : - Container

    compilé - Templates Twig compilés - Metadata Doctrine ... Cache applicatif : Vos données à mettre en cache
  16. Deux types de cache 32 Cache système : Ne change

    pas au cours de la vie de l’application (read-only) Cache applicatif : Change au cours de la vie de l’application
  17. Deux types de cache 33 Cache système : N’a pas

    besoin d’être synchronisé entre plusieurs instances frontales Cache applicatif : Doit être synchronisé entre plusieurs instances frontales
  18. Deux types de cache 34 Cache système : Filesystem Cache

    applicatif : Votre backend (Redis, PDO, …)
  19. 38

  20. L’injection de dépendances Probablement le composant qui a le plus

    changé en 3.4/4.0 40 - Autodiscovery - Autowiring - Autoconfiguration - Defaults - Bindings - Services taggués - Controllers as services
  21. Comment fonctionne le composant DependencyInjection ? 41 class Persister {/*

    ... */} class Mailer {/* ... */} class RegistrationManager { private $persister; private $mailer; public function __construct( Persister $persister, Mailer $mailer ) { /* ... */ } public function register() {} } Objectif : $manager = new RegistrationManager( new Persister($doctrine), new Mailer($twig, $swiftmailer) );
  22. Identifiant de service = nom complet de la classe 47

    Symfony 3 app.mailer: class: AppBundle\Mailer\Mailer arguments: ['@twig', '@mailer'] app.persister: class: AppBundle\Doctrine\Persister arguments: ['@doctrine'] app.registration_manager: class: AppBundle\Registration\RegistrationManager arguments: ['@app.persister', '@app.mailer']
  23. Identifiant de service = nom complet de la classe 48

    Symfony 4 App\Mailer\Mailer: arguments: ['@twig', '@mailer'] App\Doctrine\Persister: arguments: ['@doctrine'] App\Registration\RegistrationManager: arguments: ['@App\Doctrine\Persister', '@App\Mailer\Mailer']
  24. Identifiant de service = nom complet de la classe 49

    Symfony 4 App\Mailer\Mailer: arguments: ['@twig', '@mailer'] App\Doctrine\Persister: arguments: ['@doctrine'] App\Registration\RegistrationManager: arguments: ['@App\Doctrine\Persister', '@App\Mailer\Mailer'] Permet $container->get(Mailer::class) !
  25. Autodiscovery + Autowiring 51 App\Mailer\Mailer: arguments: ['@twig', '@mailer'] App\Doctrine\Persister: arguments:

    ['@doctrine'] App\Registration\RegistrationManager: arguments: ['@App\Doctrine\Persister', '@App\Mailer\Mailer'] App\: resource: '../src/*'
  26. “ L’autowiring n’a rien de magique Il est basé uniquement

    sur les noms de classes et des typehints 53
  27. Comment fonctionne le composant DependencyInjection ? 54 class Persister {/*

    ... */} class Mailer {/* ... */} class RegistrationManager { private $persister; private $mailer; public function __construct(Persister $persister, Mailer $mailer) { /* ... */ } public function register() {} } Nom des services à injecter = typehints
  28. Defaults + Autoconfiguration 56 services: _defaults: autowire: true autoconfigure: true

    public: false App\: resource: '../src/*' Defaults (par fichier) : Les nouvelles fonctionnalités sont opt-in Services privés par défaut
  29. Defaults + Autoconfiguration 57 services: _defaults: autowire: true autoconfigure: true

    public: false App\: resource: '../src/*' Defaults (par fichier) : Autoconfiguration : Configure automatiquement les services en fonctions des interfaces qu’ils implémentent
  30. Bindings 59 services: # pour un service précis App\Registration\RegistrationManager: arguments:

    $projectDir: '%kernel.project_dir%' # pour tous les services du fichier _defaults: bind: $projectDir: '%kernel.project_dir%' Automatise l’injection des paramètres
  31. Controllers as services 61 services: App\Controller\: resource: '../src/Controller' tags: ['controller.service_arguments']

    # public function contact(Request $request, Mailer $mailer) { // ... } Le tag permet d’injecter les services en paramètres de l’action
  32. 65

  33. 67 Merci ! Questions ? Bières ? ▪ Twitter :

    @titouangalopin ▪ Github : @tgalopin ▪ [email protected]