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
Dependency Injection in Symfony2 and Drupal
Search
Peter
August 24, 2013
Programming
99
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dependency Injection in Symfony2 and Drupal
My presentation for Drupal Camp Moscow 2013
Peter
August 24, 2013
Transcript
39 slides
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
More Decks by Peter
See All by Peter
Ruby microframeworks
toothfairy
3
880
Inversion of control in Symfony 2
toothfairy
3
1.3k
Other Decks in Programming
See All in Programming
AI駆動開発4年目の現在地(『あなたはFDEになるべきか?』イベント資料)
kumaiu
0
610
はじめてのPLATEAU
nokonoko1203
1
650
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
9.1k
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
240
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
Railsバージョンを4倍にした話
optim
0
1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
300
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
350
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
230
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
120
ローカルLLMの基本と近況 2611 / Local LLM basics and recent situation 2611
kishida
1
230
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
340
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
630
4 Signs Your Business is Dying
shpigford
187
23k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
So, you think you're a good person
axbom
PRO
2
2.3k
Rails Girls Zürich Keynote
gr2m
96
14k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Into the Great Unknown - MozCon
thekraken
41
2.8k
Accessibility Awareness
sabderemane
1
300
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
520
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k