Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Plongée dans l'injection de dépendances de Symfony
Search
Titouan Galopin
April 27, 2019
Programming
1.3k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Plongée dans l'injection de dépendances de Symfony
Titouan Galopin
April 27, 2019
More Decks by Titouan Galopin
See All by Titouan Galopin
Concevoir son API pour le futur
tgalopin
2
1.9k
Content editing in Symfony
tgalopin
3
1.2k
Symfony UX: a new JavaScript ecosystem for Symfony
tgalopin
4
4.2k
[SymfonyLive Paris 2020] Pragmatic frontend for Symfony developers
tgalopin
2
1.3k
SymfonyInsight: How to setup quality processes in Symfony apps
tgalopin
2
460
Symfony 5 - AFUP Day Lille 2020
tgalopin
1
1.1k
Pragmatic frontend for Symfony developers
tgalopin
2
1.4k
Demystifying React for Symfony developers
tgalopin
2
870
Symfony 5
tgalopin
1
760
Other Decks in Programming
See All in Programming
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.4k
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
310
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.4k
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
390
Seven New Principles of Software Engineering
yegor256
0
380
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
650
contenteditable と日本語入力に向き合う
colorful12
0
230
Modernizing iOS Apps
seyfoyun
0
140
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
310
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
12
11k
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
3
630
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
170
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
433
67k
Odyssey Design
rkendrick25
PRO
2
900
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Docker and Python
trallard
47
4.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
630
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.2k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
540
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Marketing to machines
jonoalderson
1
5.9k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
500
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Transcript
Plongée dans l'injection de dépendances de Symfony Avril 2019 SymfonyLive
Tunis
Titouan Galopin @tgalopin 2 insight.symfony.com
3 Une question m’obnubile …
4 Pourquoi l’architecture logicielle est-elle importante ?
5 Qu’est-ce qui différencie du code bien conçu et du
code mal conçu ?
6 La gestion du changement
7 Une architecture logicielle de qualité, c’est une architecture qui
accompagne le changement
8 Changement ... Dans le temps Dans l’environnement
9 Comment concevoir une architecture qui accompagne le changement ?
10 Créer des classes qui se partagent les responsabilités
11 Elles interagissent pour constituer l’application
12 Elles sont modifiables indépendamment les unes des autres
13 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine
14 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine
15 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine Contrats (= Interfaces)
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 C’est l’injection de dépendances
18 Encapsuler des objets dans d’autres pour créer des comportements
complexes
19 Faciliter le changement par l’utilisation de contrats
20 Mais créer un objet devient plus compliqué
21 $manager = new RegistrationManager( new Persister( new Doctrine(/* ...
*/) ), new Mailer( new Twig(/* ... */), new SwiftMailer(/* ... */) ) );
22 Symfony DependencyInjection
23 Objectif : permettre la création aisé d’instances de classes
24 Configurer ce graphe de dépendances entre classes
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 $manager = new RegistrationManager( new Persister( new Doctrine(/* ...
*/) ), new Mailer( new Twig(/* ... */), new SwiftMailer(/* ... */) ) ); Objectif
27 Fonctionnement général 1 Configuration 2 Compilation 3 Utilisation
28 1. Configuration services.yaml
29 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine
30 services: # ... App\Persister: arguments: ['@doctrine'] App\Mailer: arguments: ['@twig',
'@swiftmailer] App\RegistrationManager: arguments: ['@App\Persister', '@App\Mailer']
31 Depuis Symfony 4 : Autodiscovery Autowiring
32 services: _defaults: autowire: true App\: resource: '../src/*'
33 services: _defaults: autowire: true App\: resource: '../src/*' Autodiscovery :
importe toutes les classes dans src/ en tant que noeuds du graphe
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 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine Autodiscovery Autowiring
36 2. Compilation
37 On a maintenant un graphe de dépendances
38 On sait donc créer une instance de classe
39 Mais passer par le graphe directement, c’est lent
40 Compiler le graphe de dépendances = Le transformer en
PHP
41
42 Nouvelle possibilité : modifier le graphe entre la configuration
et l’utilisation
43 CompilerPass = Modification du graphe au moment de la
compilation
44 3. Utilisation
45 Transparente !
46 Les points d’entrée de votre application (contrôleurs, commandes, …)
font partie du graphe !
47 class RegistrationController extends AbstractController { /** * @Route("/register", name="register")
*/ public function register(RegistrationManager $manager) { // ... $manager->register($user); // ... } }
48 Mailer Persister RegistrationManager Swiftmailer Twig Doctrine RegistrationController
49 Beaucoup d’autres fonctionnalités Tags, bindings, named autowiring aliases, autoconfiguration,
factories, decorators, ...
50 Contribuez ! symfony.com/support => Slack Pinguez Nicolas Grekas
51 Merci ! Venez me voir au stand SymfonyInsight !
▪ Twitter : @titouangalopin ▪ Github : @tgalopin ▪
[email protected]