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

Symfony 4

Symfony 4

Une nouvelle expérience de développement

364d59ac0b4b4e5eee8aeb27a127d176?s=128

Titouan Galopin

June 19, 2018
Tweet

More Decks by Titouan Galopin

Other Decks in Programming

Transcript

  1. Symfony 4 Une nouvelle expérience de développement Juin 2018 AFUP

    Limoges
  2. Titouan Galopin Product Lead à Symfony 2

  3. Symfony 4 Versionnement sémantique 3

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

    de compatibilité … 4
  5. Symfony 4 Symfony 4 = Symfony 3.4 sans la couche

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

    les adapter au développement en 2018 6
  7. 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
  8. Symfony 4 PHP 7.1+ Migration 3 => 4 simplifiée par

    le système de dépréciations 8
  9. 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
  10. Symfony Flex composer create-project symfony/skeleton mydir 10

  11. 11

  12. Symfony Flex Plugin Composer Au moment de l’installation d’un package,

    Symfony Flex le configure automatiquement 12
  13. 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
  14. Symfony Flex composer require symfony/monolog-bundle 14

  15. 15

  16. Symfony Flex Définit un écosystème à partir d’alias officiels 16

  17. Symfony Flex composer require logger 17

  18. 18

  19. Symfony Flex Besoin d’un ORM ? composer require orm Besoin

    de Twig ? composer require twig 19
  20. Symfony Flex Besoin d’une API ? composer require api Besoin

    d’une interface d’admin ? composer require admin 20
  21. “ Mais comment ca marche ? 21

  22. Symfony Flex Système de “recettes” : Décrit comment un package

    doit être configuré https://symfony.sh 2 types : officielles et contrib 22
  23. Symfony Flex Plus de bundle d’application ! Nouveau kernel pour

    charger la configuration 23
  24. 24

  25. Le maker bundle

  26. Le maker bundle composer require maker 26

  27. 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
  28. 28

  29. L’intégration dans les infrastructures modernes

  30. L’intégration dans les infrastructures modernes Deux types de caches 30

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

    compilé - Templates Twig compilés - Metadata Doctrine ... Cache applicatif : Vos données à mettre en cache
  32. 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
  33. 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
  34. Deux types de cache 34 Cache système : Filesystem Cache

    applicatif : Votre backend (Redis, PDO, …)
  35. Deux types de cache 35 framework: cache: app: cache.adapter.redis default_redis_provider:

    'redis://%env(REDIS_HOST)%'
  36. L’intégration dans les infrastructures modernes Les variables d’environnement 36

  37. Les variables d’environnement .env Intégré dans les recettes Référençable dans

    la configuration de services 37
  38. 38

  39. L’injection de dépendances

  40. 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
  41. 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) );
  42. Comment fonctionne le composant DependencyInjection ? 42 Mailer Persister RegistrationManager

    Swiftmailer Twig Doctrine
  43. L’injection de dépendances Configuration => Graphe => Container compilé 43

  44. L’injection de dépendances En Symfony 3, pour configurer ce graphe

    : app/config/services.yml 44
  45. L’injection de dépendances Symfony 4 introduit différentes automatisations pour créer

    ce graphe plus simplement 45
  46. L’injection de dépendances Identifiant de service = Nom complet de

    la classe 46
  47. 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']
  48. 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']
  49. 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) !
  50. L’injection de dépendances Autodiscovery + Autowiring 50

  51. 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/*'
  52. Comment fonctionne le composant DependencyInjection ? 52 Mailer Persister RegistrationManager

    Swiftmailer Twig Doctrine Autodiscovery Autowiring
  53. “ L’autowiring n’a rien de magique Il est basé uniquement

    sur les noms de classes et des typehints 53
  54. 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
  55. L’injection de dépendances Defaults + Autoconfiguration 55

  56. 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
  57. 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
  58. L’injection de dépendances Bindings : et les paramètres ? 58

  59. 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
  60. L’injection de dépendances Controllers as services Les contrôleurs sont des

    services 60
  61. 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
  62. Comment fonctionne le composant DependencyInjection ? 62 Mailer Persister RegistrationManager

    Swiftmailer Twig Doctrine RegistrationController
  63. L’injection de dépendances Services taggués 63

  64. L’injection de dépendances 64 services: App\Manager\TwigManager: arguments: [!tagged twig.extension]

  65. 65

  66. 66 Contribuez ! symfony.com/support => Slack Pinguez Nicolas Grekas

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

    @titouangalopin ▪ Github : @tgalopin ▪ titouan.galopin@symfony.com