SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
INJECTION DE
DÉPENDANCES,
CONTAINERS & PHP-DI
BONJOUR

MATTHIEU NAPOLI
My C-Sense ( myclabs ), Lyon
mnapoli.fr / @matthieunapoli
github.com/mnapoli

PHP-DI
Container d'injection de dépendances
depuis Mars 2012
DI ≠ DIC
INJECTION DE DÉPENDANCES
Construire son code pour ne plus créer ses dépendances
=> méthode

CONTAINER

Construit des objets et injecte les dépendances
=> outil
INJECTION DE
DÉPENDANCES
WORKFLOW D'UN CODE CLASSIQUE
Application :
$foo = new FooController();
$foo->loginAction();

Classe FooController :
public function loginAction() {
$bar = new Bar(); // ou $bar = Bar::getInstance()
$bar->doSomething();
}

Classe Bar :
public function doSomething() {
$bim = new Bim(); // ou $bim = Bim::getInstance()
$bim->doSomethingElse();
}
WORKFLOW D'UN CODE CLASSIQUE
=> dépendances choisies lors de l'écriture du code (hard-coded)
Tests : tester du code qui utilise un service web, des fichiers, une
BDD, du cache, …
Extensibilité : mon système de log loggue dans un fichier, j'aimerai
qu'il écrive en BDD et les envoie par email…
Coupling : je veux changer de système de cache (ou sa config) -> je
dois changer le code partout…
TRANSFORMATION
TRANSFORMATION
Avant :
class FooController {
public function loginAction() {
$bar = new Bar(); // ou $bar = Bar::getInstance()
$bar->doSomething();
}
}

Après :
class FooController {
private $bar;
public function __construct(Bar $bar) {
$this->bar = $bar;
}
public function loginAction() {
$this->bar->doSomething();
}
}
WORKFLOW D'UN CODE UTILISANT L'INJECTION
DE DÉPENDANCES
Application :
$bim = new Bim();
$bar = new Bar($bim);
$foo = new FooController($bar);
$foo->loginAction();

Classe FooController :
public function loginAction() {
$this->bar->doSomething();
}

Classe Bar :
public function doSomething() {
$this->bim->doSomethingElse();
}
INVERSION OF CONTROL
=> dépendances choisies lors de l'exécution
Possibilité de remplacer les dépendances injectées
Dans les classes, on ne gère plus les dépendances, leurs
configurations…
Code plus générique :
code against interfaces
CODE AGAINST INTERFACES
class StoreService {
public function __construct(GeolocationService $geolocationService) { … }
}
interface GeolocationService {
public function getCoordinates($address);
}
class GoogleMaps implements GeolocationService { … }
class OpenStreetMap implements GeolocationService { … }
MAIS
Nécessite de gérer les dépendances dans l'application
$bim = new Bim();
$bar = new Bar($bim);
$foo = new FooController($bar);
CONTAINER
WORKFLOW D'UN CODE UTILISANT UN
CONTAINER
Application :
$foo = $container->get('FooController');
$foo->doSomething();

Classe FooController :
public function loginAction() {
$this->bar->doSomething();
}

Classe Bar :
public function doSomething() {
$this->bim->doSomethingElse();
}
$foo = $container->get('FooController');

=
$bim = new Bim();
$bar = new Bar($bim);
$foo = new FooController($bar);
Le container fait les injections, et aide à construire les graphes d'objets
ATTENTION !
$foo = $container->get('FooController');

Service Locator : anti-pattern
CONFIGURATION DU CONTAINER
Nécessite de configurer le container pour qu'il injecte les bons objets
Chaque container se configure différement
EXEMPLE SIMPLE
$container = new Container();
$bim = new Bim();
$bar = new Bar($bim);
$container->set('Bim', $bim);
$container->set('Bar', $bar);

Problème : initialise tous les objets à chaque requête
CALLBACKS
$container = new Container();
$container->set('Bim', function() {
return new Bim();
});
$container->set('Bar', function() use ($container) {
return new Bar($bim);
});

Verbeux, mais efficace
FICHIERS DE CONFIGURATION
Tableau PHP
YAML
XML
…
Formats différents pour chaque librairie
Symfony DI
ZendDi (+ tous les autres)
Pimple
Aura DI
Laravel
Mouf
Orno
PPI
…
PHP-DI
POURQUOI ?
Pratique
Volontairement copieur
Framework-agnostic
PHP-DI
v1.0 (août 2012) : injections via annotations (PC)
v2.0 (décembre 2012) : refactoring, version stable
v3.0 (avril 2013) : annotations, config PHP, YAML, …
…
v3.5 (octobre 2013)
REFLECTION
Résolution de dépendances intelligente
class Foo {
public function __construct(Bar $param1) {
}
}

~ 90% des cas -> 0 configuration
ANNOTATIONS
Inspiré de Java/Spring
use DIAnnotationInject;
class UserController {
/**
* @Inject
*/
private $userRepository;
public function loginAction($email, $password) {
$user = $this->userRepository->login($email, $password);
// ...
}
}

Pas la solution à tout, mais très pratique dans les contrôleurs
CONFIGURATION PHP
$container->set('Bar');
$container->set('Foo')
->withConstructor(array('Bar'));
$container->set('MyInterface')
->bindTo('MyImplementation');
YAML
Bar:
Foo:
constructor: [ Bar ]
MyInterface:
class: MyImplementation
FUTUR
PHP-DI : v4.0, intégration avec d'autres frameworks
PHP-FIG : collaboration pour une PSR ContainerInterface
Communauté : diffusion, meilleure doc et best-practices dans ZF2
et Symfony 2…
MERCI

Site officiel : php-di.org
GitHub : mnapoli/PHP-DI
Twitter : @PHPDI

Contenu connexe

Tendances

PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Meet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireMeet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireJulien Vinber
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?Ruau Mickael
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlStéphane Legrand
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPierre Faure
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
09 big data mapreduce
09 big data mapreduce09 big data mapreduce
09 big data mapreducePatrick Bury
 
Les bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralLes bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralGeoffrey Bachelet
 

Tendances (19)

PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Meet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireMeet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaire
 
Tour C++
Tour C++Tour C++
Tour C++
 
Compteur de visites
Compteur de visitesCompteur de visites
Compteur de visites
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
 
Langage Perl
Langage PerlLangage Perl
Langage Perl
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
[20110219] pfffについて
[20110219] pfffについて[20110219] pfffについて
[20110219] pfffについて
 
Ds2 informatique
Ds2 informatiqueDs2 informatique
Ds2 informatique
 
Ch07
Ch07Ch07
Ch07
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Cours php
Cours phpCours php
Cours php
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Examen 2011 exo 4
Examen 2011 exo 4Examen 2011 exo 4
Examen 2011 exo 4
 
09 big data mapreduce
09 big data mapreduce09 big data mapreduce
09 big data mapreduce
 
Les bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralLes bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en général
 

En vedette

Photos 2005 Nbc
Photos 2005 NbcPhotos 2005 Nbc
Photos 2005 Nbcscherzo
 
Trabajo De Tecnologia
Trabajo De TecnologiaTrabajo De Tecnologia
Trabajo De TecnologiaSergio_10
 
Fonds d’assurance maladie igf rapport 2010 / http://www.igf.finances.gouv.fr...
Fonds d’assurance maladie  igf rapport 2010 / http://www.igf.finances.gouv.fr...Fonds d’assurance maladie  igf rapport 2010 / http://www.igf.finances.gouv.fr...
Fonds d’assurance maladie igf rapport 2010 / http://www.igf.finances.gouv.fr...Ministère de l'Économie et des Finances
 
Cryptovirology - Basics
Cryptovirology - BasicsCryptovirology - Basics
Cryptovirology - BasicsReda Boucid
 
PresentacióN1.1 Cuali Y Cuanti Enviar
PresentacióN1.1 Cuali Y Cuanti EnviarPresentacióN1.1 Cuali Y Cuanti Enviar
PresentacióN1.1 Cuali Y Cuanti Enviarbonita1409
 
¿Qué es UNINBOL-PVS?
¿Qué es UNINBOL-PVS?¿Qué es UNINBOL-PVS?
¿Qué es UNINBOL-PVS?Aymen76
 
Nissan part de marché en europe atteignant 3% pour la 4e fois en 5 mois
Nissan  part de marché en europe atteignant  3% pour la 4e fois en 5 moisNissan  part de marché en europe atteignant  3% pour la 4e fois en 5 mois
Nissan part de marché en europe atteignant 3% pour la 4e fois en 5 moisRésultats Autos
 
eBook VII Foro Turístico Hosteltur
eBook VII Foro Turístico HosteltureBook VII Foro Turístico Hosteltur
eBook VII Foro Turístico HostelturHosteltur
 
Dr manzo norbert chu fort de france and ulf nestler giessen . gliolan
Dr manzo norbert chu fort de france and ulf nestler  giessen . gliolanDr manzo norbert chu fort de france and ulf nestler  giessen . gliolan
Dr manzo norbert chu fort de france and ulf nestler giessen . gliolanNorbert Manzo
 
Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...
Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...
Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...MasterBase®
 
NiñEzteoriapractica
NiñEzteoriapracticaNiñEzteoriapractica
NiñEzteoriapracticaguest9cb06
 

En vedette (20)

29 vem6 pub on line
29 vem6 pub on line29 vem6 pub on line
29 vem6 pub on line
 
C Est D Un Gout
C Est D Un GoutC Est D Un Gout
C Est D Un Gout
 
Anglomania
AnglomaniaAnglomania
Anglomania
 
Photos 2005 Nbc
Photos 2005 NbcPhotos 2005 Nbc
Photos 2005 Nbc
 
Trabajo De Tecnologia
Trabajo De TecnologiaTrabajo De Tecnologia
Trabajo De Tecnologia
 
Fonds d’assurance maladie igf rapport 2010 / http://www.igf.finances.gouv.fr...
Fonds d’assurance maladie  igf rapport 2010 / http://www.igf.finances.gouv.fr...Fonds d’assurance maladie  igf rapport 2010 / http://www.igf.finances.gouv.fr...
Fonds d’assurance maladie igf rapport 2010 / http://www.igf.finances.gouv.fr...
 
Ecomusee alsace saison-2014
Ecomusee alsace saison-2014Ecomusee alsace saison-2014
Ecomusee alsace saison-2014
 
Morsani
MorsaniMorsani
Morsani
 
Novedades Tecnológicas
Novedades TecnológicasNovedades Tecnológicas
Novedades Tecnológicas
 
Cryptovirology - Basics
Cryptovirology - BasicsCryptovirology - Basics
Cryptovirology - Basics
 
PresentacióN1.1 Cuali Y Cuanti Enviar
PresentacióN1.1 Cuali Y Cuanti EnviarPresentacióN1.1 Cuali Y Cuanti Enviar
PresentacióN1.1 Cuali Y Cuanti Enviar
 
¿Qué es UNINBOL-PVS?
¿Qué es UNINBOL-PVS?¿Qué es UNINBOL-PVS?
¿Qué es UNINBOL-PVS?
 
Gradle_ToulouseJUG
Gradle_ToulouseJUGGradle_ToulouseJUG
Gradle_ToulouseJUG
 
Nissan part de marché en europe atteignant 3% pour la 4e fois en 5 mois
Nissan  part de marché en europe atteignant  3% pour la 4e fois en 5 moisNissan  part de marché en europe atteignant  3% pour la 4e fois en 5 mois
Nissan part de marché en europe atteignant 3% pour la 4e fois en 5 mois
 
Rapport parlementaire RSI 21 09 2015
Rapport parlementaire RSI 21 09 2015Rapport parlementaire RSI 21 09 2015
Rapport parlementaire RSI 21 09 2015
 
eBook VII Foro Turístico Hosteltur
eBook VII Foro Turístico HosteltureBook VII Foro Turístico Hosteltur
eBook VII Foro Turístico Hosteltur
 
Dr manzo norbert chu fort de france and ulf nestler giessen . gliolan
Dr manzo norbert chu fort de france and ulf nestler  giessen . gliolanDr manzo norbert chu fort de france and ulf nestler  giessen . gliolan
Dr manzo norbert chu fort de france and ulf nestler giessen . gliolan
 
Text fr
Text frText fr
Text fr
 
Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...
Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...
Webinar Training: Optimizando el uso de la plataforma MasterBase® ST / Jueves...
 
NiñEzteoriapractica
NiñEzteoriapracticaNiñEzteoriapractica
NiñEzteoriapractica
 

Similaire à [FR] Injection de dépendances, Containers & PHP-DI

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéPublicis Sapient Engineering
 
Synchroniser ses applis simplement avec akeneo/batch
Synchroniser ses applis simplement avec akeneo/batchSynchroniser ses applis simplement avec akeneo/batch
Synchroniser ses applis simplement avec akeneo/batchgplanchat
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueVladyslav Riabchenko
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsVladyslav Riabchenko
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2dhugomallet
 
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieCours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieafdoumbia
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 

Similaire à [FR] Injection de dépendances, Containers & PHP-DI (20)

Chapitre 04 : les fonctions
Chapitre 04 : les fonctionsChapitre 04 : les fonctions
Chapitre 04 : les fonctions
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilité
 
Atelier18
Atelier18 Atelier18
Atelier18
 
Synchroniser ses applis simplement avec akeneo/batch
Synchroniser ses applis simplement avec akeneo/batchSynchroniser ses applis simplement avec akeneo/batch
Synchroniser ses applis simplement avec akeneo/batch
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Tpag appli-galaxy
Tpag appli-galaxyTpag appli-galaxy
Tpag appli-galaxy
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Php4 Mysql
Php4 MysqlPhp4 Mysql
Php4 Mysql
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratique
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
Php1
Php1Php1
Php1
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applications
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieCours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
 
Tuto bada
Tuto badaTuto bada
Tuto bada
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Chap2fonctionscpp
Chap2fonctionscppChap2fonctionscpp
Chap2fonctionscpp
 

[FR] Injection de dépendances, Containers & PHP-DI

  • 2. BONJOUR MATTHIEU NAPOLI My C-Sense ( myclabs ), Lyon mnapoli.fr / @matthieunapoli github.com/mnapoli PHP-DI Container d'injection de dépendances depuis Mars 2012
  • 4. INJECTION DE DÉPENDANCES Construire son code pour ne plus créer ses dépendances => méthode CONTAINER Construit des objets et injecte les dépendances => outil
  • 6. WORKFLOW D'UN CODE CLASSIQUE Application : $foo = new FooController(); $foo->loginAction(); Classe FooController : public function loginAction() { $bar = new Bar(); // ou $bar = Bar::getInstance() $bar->doSomething(); } Classe Bar : public function doSomething() { $bim = new Bim(); // ou $bim = Bim::getInstance() $bim->doSomethingElse(); }
  • 7. WORKFLOW D'UN CODE CLASSIQUE => dépendances choisies lors de l'écriture du code (hard-coded) Tests : tester du code qui utilise un service web, des fichiers, une BDD, du cache, … Extensibilité : mon système de log loggue dans un fichier, j'aimerai qu'il écrive en BDD et les envoie par email… Coupling : je veux changer de système de cache (ou sa config) -> je dois changer le code partout…
  • 9. TRANSFORMATION Avant : class FooController { public function loginAction() { $bar = new Bar(); // ou $bar = Bar::getInstance() $bar->doSomething(); } } Après : class FooController { private $bar; public function __construct(Bar $bar) { $this->bar = $bar; } public function loginAction() { $this->bar->doSomething(); } }
  • 10. WORKFLOW D'UN CODE UTILISANT L'INJECTION DE DÉPENDANCES Application : $bim = new Bim(); $bar = new Bar($bim); $foo = new FooController($bar); $foo->loginAction(); Classe FooController : public function loginAction() { $this->bar->doSomething(); } Classe Bar : public function doSomething() { $this->bim->doSomethingElse(); }
  • 11. INVERSION OF CONTROL => dépendances choisies lors de l'exécution Possibilité de remplacer les dépendances injectées Dans les classes, on ne gère plus les dépendances, leurs configurations… Code plus générique : code against interfaces
  • 12. CODE AGAINST INTERFACES class StoreService { public function __construct(GeolocationService $geolocationService) { … } } interface GeolocationService { public function getCoordinates($address); } class GoogleMaps implements GeolocationService { … } class OpenStreetMap implements GeolocationService { … }
  • 13. MAIS Nécessite de gérer les dépendances dans l'application $bim = new Bim(); $bar = new Bar($bim); $foo = new FooController($bar);
  • 15. WORKFLOW D'UN CODE UTILISANT UN CONTAINER Application : $foo = $container->get('FooController'); $foo->doSomething(); Classe FooController : public function loginAction() { $this->bar->doSomething(); } Classe Bar : public function doSomething() { $this->bim->doSomethingElse(); }
  • 16. $foo = $container->get('FooController'); = $bim = new Bim(); $bar = new Bar($bim); $foo = new FooController($bar);
  • 17. Le container fait les injections, et aide à construire les graphes d'objets
  • 18. ATTENTION ! $foo = $container->get('FooController'); Service Locator : anti-pattern
  • 19. CONFIGURATION DU CONTAINER Nécessite de configurer le container pour qu'il injecte les bons objets Chaque container se configure différement
  • 20. EXEMPLE SIMPLE $container = new Container(); $bim = new Bim(); $bar = new Bar($bim); $container->set('Bim', $bim); $container->set('Bar', $bar); Problème : initialise tous les objets à chaque requête
  • 21. CALLBACKS $container = new Container(); $container->set('Bim', function() { return new Bim(); }); $container->set('Bar', function() use ($container) { return new Bar($bim); }); Verbeux, mais efficace
  • 22. FICHIERS DE CONFIGURATION Tableau PHP YAML XML … Formats différents pour chaque librairie
  • 23. Symfony DI ZendDi (+ tous les autres) Pimple Aura DI Laravel Mouf Orno PPI …
  • 26. PHP-DI v1.0 (août 2012) : injections via annotations (PC) v2.0 (décembre 2012) : refactoring, version stable v3.0 (avril 2013) : annotations, config PHP, YAML, … … v3.5 (octobre 2013)
  • 27. REFLECTION Résolution de dépendances intelligente class Foo { public function __construct(Bar $param1) { } } ~ 90% des cas -> 0 configuration
  • 28. ANNOTATIONS Inspiré de Java/Spring use DIAnnotationInject; class UserController { /** * @Inject */ private $userRepository; public function loginAction($email, $password) { $user = $this->userRepository->login($email, $password); // ... } } Pas la solution à tout, mais très pratique dans les contrôleurs
  • 30. YAML Bar: Foo: constructor: [ Bar ] MyInterface: class: MyImplementation
  • 31. FUTUR PHP-DI : v4.0, intégration avec d'autres frameworks PHP-FIG : collaboration pour une PSR ContainerInterface Communauté : diffusion, meilleure doc et best-practices dans ZF2 et Symfony 2…
  • 32. MERCI Site officiel : php-di.org GitHub : mnapoli/PHP-DI Twitter : @PHPDI