A talk about dependency injection and the Symfony2 DI Container given at PHPUG Cologne / Bonn in September 2011.
Dependency Injection
View Slide
Konzept
Statt dem hier:
public function __construct() {$this->dep1 = new Dependency1();$this->dep2 = new Dependency2();$this->dep3 = new Dependency3();}
… nimmt man das da:
public function __construct(DependencyInterface1 $dep1,DependencyInterface2 $dep2,DependencyInterface3 $dep3) {$this->dep1 = $dep1;// ...}
Das ist alles.
Warum?
Separation of concerns
Testbarkeit
Übersichtlichkeit
Praxis
Wer braucht schon ein Framework?
class DoctrineEntityManagerBuilder {public static function build() {$config = new Configuration();$config->setFoo("bar");$connOpts = array("driver" => "pdo_sqlite","path" => "database.sqlite");return EntityManager::create($connOpts, $config);}}
Wildwuchs vermeiden
class DoctrineEntityManagerBuilder {private static $instance;public function build() {if (empty(static::$instance)) {// ...static::$instance =EntityManager::create($connOpts, $config);}return static::$instance;}}
Symfony2 ServiceContainer
Service?
class DataImporter {private $em;Private $sourceUrl;public function __construct(EntityManager $em,$sourceUrl) {$this->em = $em;$this->sourceUrl = $sourceUrl;}public function import() {// ...}}
DataImporter%dataimporter.source_url%
class MyExtension extends Extension {public function load(...) {$loader = new XmlFileLoader(...);$loader->load('services.xml');// Konfiguration auslesen// und in Container einfügen}public function getAlias() {return "my_extension";}}
class MyController extends Controller {public function importAction() {$importer =$this->get("dataimporter");$importer->import();// ...}}
Fragen?