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
67
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
800
Inversion of control in Symfony 2
toothfairy
3
1.3k
Other Decks in Programming
See All in Programming
関数の挙動書き換える
takatofukui
4
730
flutter_kaigi_2025.pdf
kyoheig3
1
350
Honoを技術選定したAI要件定義プラットフォームAcsimでの意思決定
codenote
0
250
歴史から学ぶ「Why PHP?」 PHPを書く理由を改めて理解する / Learning from History: “Why PHP?” Rediscovering the Reasons for Writing PHP
seike460
PRO
0
160
オフライン対応!Flutterアプリに全文検索エンジンを実装する @FlutterKaigi2025
itsmedreamwalker
2
220
Evolving NEWT’s TypeScript Backend for the AI-Driven Era
xpromx
0
110
The Missing Link in Angular's Signal Story: Resource API and httpResource
manfredsteyer
PRO
0
140
例外処理を理解して、設計段階からエラーを見つけやすく、起こりにくく #phpconfuk
kajitack
12
6.3k
Developing Specifications - Jakarta EE: a Real World Example
ivargrimstad
0
130
Eloquentを使ってどこまでコードの治安を保てるのか?を新人が考察してみた
itokoh0405
0
3.2k
Private APIの呼び出し方
kishikawakatsumi
3
890
最新のDirectX12で使えるレイトレ周りの機能追加について
projectasura
0
280
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
680
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
How to train your dragon (web standard)
notwaldorf
97
6.4k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
RailsConf 2023
tenderlove
30
1.3k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
980
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
The Pragmatic Product Professional
lauravandoore
36
7k
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