Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Plongée dans l'injection de dépendances de Symfony
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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.2k
SymfonyInsight: How to setup quality processes in Symfony apps
tgalopin
2
440
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
750
Other Decks in Programming
See All in Programming
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
200
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
390
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
210
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
AIが無かった頃の素敵な出会いの話
codmoninc
1
380
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
440
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
850
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
240
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
960
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
470
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
550
Featured
See All Featured
Leo the Paperboy
mayatellez
8
2.1k
The Language of Interfaces
destraynor
162
27k
Documentation Writing (for coders)
carmenintech
77
5.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Are puppies a ranking factor?
jonoalderson
1
3.8k
How to make the Groovebox
asonas
2
2.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
Skip the Path - Find Your Career Trail
mkilby
1
180
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Mobile First: as difficult as doing things right
swwweet
225
10k
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]