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
Dependency Injection in Symfony2 and Drupal
Search
Peter
August 24, 2013
Programming
0
63
Dependency Injection in Symfony2 and Drupal
My presentation for Drupal Camp Moscow 2013
Peter
August 24, 2013
Tweet
Share
More Decks by Peter
See All by Peter
Ruby microframeworks
toothfairy
3
780
Inversion of control in Symfony 2
toothfairy
3
1.3k
Other Decks in Programming
See All in Programming
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
270
php-conference-japan-2024
tasuku43
0
280
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
5
1.2k
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
440
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
170
Zoneless Testing
rainerhahnekamp
0
120
tidymodelsによるtidyな生存時間解析 / Japan.R2024
dropout009
1
770
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
103 Early Hints
sugi_0000
1
230
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
910
快速入門可觀測性
blueswen
0
350
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
220
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Making the Leap to Tech Lead
cromwellryan
133
9k
Typedesign – Prime Four
hannesfritz
40
2.4k
4 Signs Your Business is Dying
shpigford
181
21k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Practical Orchestrator
shlominoach
186
10k
Fireside Chat
paigeccino
34
3.1k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
A Philosophy of Restraint
colly
203
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Facilitating Awesome Meetings
lara
50
6.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Transcript
Dependency Injection component. What where why? http://www.tv.net.ua/news/na_teleekrane/1050664487-zvezdnye-odessity-v-yetu-pyatnicu-proveryat-svoj-intellekt-v-programme-chto-gde-kogda-zvezdnye-vojny.html Petr Sergeev, EvercodeLab
About me • Web-developer since 2006 • EvercodeLab co-founder and
CTO • Ruby Php Python, over 9000 frameworks • Genius Billionaire Playboy Philanthropist
• Basics • Dependency injection • In Symfony2 • In
Drupal 8
Basics about injecting, good code and other things
Good code is good • Clean • Reusable • Clutter-free
• Testable
Bad policeman class Notifier { private $mailer; public function __construct()
{ $this->mailer = new Mailer(); } public function notify() { ... $this->mailer->send($from, $to, $msg); ... } }
Good policeman class Notifier { private $mailer; public function __construct(Mailer
$m) { $this->mailer = $m; } public function notify() { ... $this->mailer->send($from, $to, $msg); ... } } $mailer = new Mailer(); $notifier = new Notifier($mailer);
Superman class Notifier { private $mailer; public function __construct(MailerInterface $m)
{ $this->mailer = $m; } public function notify() { ... $this->mailer->send($from, $to, $msg); ... } } $mailer = new Mailer(); $notifier = new Notifier($mailer); http://www.flickr.com/photos/gkyc/with/43902217/
Injection types • Property injection • Contructor injection • Setter
injection
Property injection class Notifier { public $mailer; ... } $mailer
= new Mailer(); $notifier = new Notifier($mailer); $notifier->mailer = $mailer;
Constructor injection class Notifier { private $mailer; public function __construct(Mailer
$m) { $this->mailer = $m; } }
Setter injection class Notifier { private $mailer; public function setMailer($mailer)
{ $this->mailer = $mailer; } } $mailer = new Mailer(); $notifier = new Notifier($mailer); $notifier->setMailer($mailer);
Dependency Injection = Inversion of control http://www.flickr.com/photos/begumf/with/7916700382/
«Do not instantiate the dependencies explicitly in your class. Instead,
declaratively express dependencies in your class definition.» MSDN
How it all goes • Manual injection • Factory •
From container/injector
Dependency Injection in action
What does user do twig.extension.text: class: Twig_Extensions_Extension_Text tags: - {
name: twig.extension } app.user.validator.unique: class: App\UserBundle\Validator\UniqueValidator arguments: [@app.manager.orm_user_manager] tags: - { name: validator.constraint_validator, alias:app.user.validator.unique } app.listener.router: class: App\DefaultBundle\Listener\RouterListener tags: - { name: kernel.event_listener, event: kernel.request } arguments: [@router]
What does component do • Construct objects graph • Instantiatiate
services • Application logic and infrastructure logic are kept separately • Cache dependencies
Service Bunch of code responsible some particular global task
Separation of concerns http://www.luminescentphoto.com/blog/2011/04/27/concert-going-with-the-p7000/
To be or not to be • Database • Cache
• Mailer • Logger • Model • Controller(?)
How it works • $container->getService('some_service') • Read services graph •
Instantiate service • ... • Profit
Scopes app.form.handler.registration: class: App\UserBundle\Form\Handler\FormHandler arguments: [@fos_user.registration.form, @request] scope: request app.listener.location:
class: App\DefaultBundle\Listener\LocationListener arguments: [@request, @session, @security.context, @router] scope: request
Tags app.listener.accountNumber: class: App\UserBundle\Listener\AccountNumberListener calls: - [ setContainer, [ @service_container
] ] tags: - { name: doctrine.event_listener, event: postUpdate }
Pros and cons http://www.flickr.com/photos/jayashree-shankar/with/5180430923/
• Been loaded service cannot be redefined • Low coupling
• Type Hinting • Localization for debug and testing • Caching
• Blackbox • Hard to understand, huh?
None
Symfony 2
HttpKernel /** * Boots the current kernel. * @api */
public function boot() { // init container $this->initializeContainer(); foreach ($this->getBundles() as $bundle) { $bundle->setContainer($this->container); $bundle->boot(); } $this->booted = true; }
Symfony2 • Compiling • Tagging, event subscribers and listeners •
Bundles
$em = $this->container->get('doctrine.orm.entity_manager');
Drupal 8
Services available • Database • Module handler • Request object
2 ways of usage • Drupal::service(‘db’) • OOP style
What’s that all about
Sources list • Wikipedia • Drupal.org • Symfony.com • Katbailey.github.io
http://www.flickr.com/photos/walkn/with/3526522573/
Thanks @i_feya
[email protected]
Petr Sergeev