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
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
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
Deux types de cache 31 Cache système : - Container compilé - Templates Twig compilés - Metadata Doctrine ... Cache applicatif : Vos données à mettre en cache
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
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
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
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) );
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']
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']
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) !
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
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
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