Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dependency Injection

Dependency Injection

A talk about dependency injection and the Symfony2 DI Container given at PHPUG Cologne / Bonn in September 2011.

Tobias Gies

May 03, 2012
Tweet

More Decks by Tobias Gies

Other Decks in Programming

Transcript

  1. Dependency Injection

    View Slide

  2. Konzept

    View Slide

  3. Statt dem hier:

    View Slide

  4. public function __construct() {
    $this->dep1 = new Dependency1();
    $this->dep2 = new Dependency2();
    $this->dep3 = new Dependency3();
    }

    View Slide

  5. … nimmt man das da:

    View Slide

  6. public function __construct(
    DependencyInterface1 $dep1,
    DependencyInterface2 $dep2,
    DependencyInterface3 $dep3) {
    $this->dep1 = $dep1;
    // ...
    }

    View Slide

  7. Das ist alles.

    View Slide

  8. Warum?

    View Slide

  9. Separation of concerns

    View Slide

  10. Testbarkeit

    View Slide

  11. Übersichtlichkeit

    View Slide

  12. Praxis

    View Slide

  13. Wer braucht schon ein Framework?

    View Slide

  14. 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
    );
    }
    }

    View Slide

  15. Wildwuchs vermeiden

    View Slide

  16. class DoctrineEntityManagerBuilder {
    private static $instance;
    public function build() {
    if (empty(static::$instance)) {
    // ...
    static::$instance =
    EntityManager::create(
    $connOpts, $config
    );
    }
    return static::$instance;
    }
    }

    View Slide

  17. Symfony2 ServiceContainer

    View Slide

  18. Service?

    View Slide

  19. class DataImporter {
    private $em;
    Private $sourceUrl;
    public function __construct(
    EntityManager $em,
    $sourceUrl) {
    $this->em = $em;
    $this->sourceUrl = $sourceUrl;
    }
    public function import() {
    // ...
    }
    }

    View Slide




  20. DataImporter





    %dataimporter.source_url%



    View Slide

  21. 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";
    }
    }

    View Slide

  22. class MyController extends Controller {
    public function importAction() {
    $importer =
    $this->get("dataimporter");
    $importer->import();
    // ...
    }
    }

    View Slide

  23. Fragen?

    View Slide