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

Plongée dans l'injection de dépendances de Symfony

Plongée dans l'injection de dépendances de Symfony

364d59ac0b4b4e5eee8aeb27a127d176?s=128

Titouan Galopin

April 27, 2019
Tweet

Transcript

  1. Plongée dans l'injection de dépendances de Symfony Avril 2019 SymfonyLive

    Tunis
  2. Titouan Galopin @tgalopin 2 insight.symfony.com

  3. 3 Une question m’obnubile …

  4. 4 Pourquoi l’architecture logicielle est-elle importante ?

  5. 5 Qu’est-ce qui différencie du code bien conçu et du

    code mal conçu ?
  6. 6 La gestion du changement

  7. 7 Une architecture logicielle de qualité, c’est une architecture qui

    accompagne le changement
  8. 8 Changement ... Dans le temps Dans l’environnement

  9. 9 Comment concevoir une architecture qui accompagne le changement ?

  10. 10 Créer des classes qui se partagent les responsabilités

  11. 11 Elles interagissent pour constituer l’application

  12. 12 Elles sont modifiables indépendamment les unes des autres

  13. 13 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine

  14. 14 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine

  15. 15 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine Contrats (= Interfaces)

  16. 16 interface PersisterInterface { /* ... */ } interface MailerInterface

    { /* ... */ } class RegistrationManager { private $persister; private $mailer; public function __construct( PersisterInterface $persister, MailerInterface $mailer ) { $this->persister = $persister; $this->mailer = $mailer; } public function register() {/* ... */} }
  17. 17 C’est l’injection de dépendances

  18. 18 Encapsuler des objets dans d’autres pour créer des comportements

    complexes
  19. 19 Faciliter le changement par l’utilisation de contrats

  20. 20 Mais créer un objet devient plus compliqué

  21. 21 $manager = new RegistrationManager( new Persister( new Doctrine(/* ...

    */) ), new Mailer( new Twig(/* ... */), new SwiftMailer(/* ... */) ) );
  22. 22 Symfony DependencyInjection

  23. 23 Objectif : permettre la création aisé d’instances de classes

  24. 24 Configurer ce graphe de dépendances entre classes

  25. 25 interface PersisterInterface { /* ... */ } interface MailerInterface

    { /* ... */ } class RegistrationManager { private $persister; private $mailer; public function __construct( PersisterInterface $persister, MailerInterface $mailer ) { $this->persister = $persister; $this->mailer = $mailer; } public function register() {/* ... */} }
  26. 26 $manager = new RegistrationManager( new Persister( new Doctrine(/* ...

    */) ), new Mailer( new Twig(/* ... */), new SwiftMailer(/* ... */) ) ); Objectif
  27. 27 Fonctionnement général 1 Configuration 2 Compilation 3 Utilisation

  28. 28 1. Configuration services.yaml

  29. 29 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine

  30. 30 services: # ... App\Persister: arguments: ['@doctrine'] App\Mailer: arguments: ['@twig',

    '@swiftmailer] App\RegistrationManager: arguments: ['@App\Persister', '@App\Mailer']
  31. 31 Depuis Symfony 4 : Autodiscovery Autowiring

  32. 32 services: _defaults: autowire: true App\: resource: '../src/*'

  33. 33 services: _defaults: autowire: true App\: resource: '../src/*' Autodiscovery :

    importe toutes les classes dans src/ en tant que noeuds du graphe
  34. 34 services: _defaults: autowire: true App\: resource: '../src/*' Autodiscovery :

    importe toutes les classes dans src/ en tant que noeuds du graphe Autowiring : créé les liens entre les noeuds du graphe automatiquement
  35. 35 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine Autodiscovery Autowiring

  36. 36 2. Compilation

  37. 37 On a maintenant un graphe de dépendances

  38. 38 On sait donc créer une instance de classe

  39. 39 Mais passer par le graphe directement, c’est lent

  40. 40 Compiler le graphe de dépendances = Le transformer en

    PHP
  41. 41

  42. 42 Nouvelle possibilité : modifier le graphe entre la configuration

    et l’utilisation
  43. 43 CompilerPass = Modification du graphe au moment de la

    compilation
  44. 44 3. Utilisation

  45. 45 Transparente !

  46. 46 Les points d’entrée de votre application (contrôleurs, commandes, …)

    font partie du graphe !
  47. 47 class RegistrationController extends AbstractController { /** * @Route("/register", name="register")

    */ public function register(RegistrationManager $manager) { // ... $manager->register($user); // ... } }
  48. 48 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine RegistrationController

  49. 49 Beaucoup d’autres fonctionnalités Tags, bindings, named autowiring aliases, autoconfiguration,

    factories, decorators, ...
  50. 50 Contribuez ! symfony.com/support => Slack Pinguez Nicolas Grekas

  51. 51 Merci ! Venez me voir au stand SymfonyInsight !

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