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
790
Inversion of control in Symfony 2
toothfairy
3
1.3k
Other Decks in Programming
See All in Programming
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
240
最近のVS Codeで気になるニュース 2025/01
74th
1
240
2,500万ユーザーを支えるSREチームの6年間のスクラムのカイゼン
honmarkhunt
6
4.2k
Spring gRPC について / About Spring gRPC
mackey0225
0
180
動作確認やテストで漏れがちな観点3選
starfish719
5
880
振り返れば奴(Cline)がいる
keiyagi
0
130
Flatt Security XSS Challenge 解答・解説
flatt_security
0
1.1k
CloudNativePGがCNCF Sandboxプロジェクトになったぞ! 〜CloudNativePGの仕組みの紹介〜
nnaka2992
0
200
【PHP】破壊的バージョンアップと戦った話〜決断と説得
satoshi256kbyte
0
100
Scaling your build logic
antalmonori
1
150
Внедряем бюджетирование, или Как сделать хорошо?
lamodatech
0
980
Linux && Docker 研修/Linux && Docker training
forrep
23
4.1k
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.2k
The Pragmatic Product Professional
lauravandoore
32
6.4k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
Visualization
eitanlees
146
15k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
270
Statistics for Hackers
jakevdp
797
220k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Fireside Chat
paigeccino
34
3.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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