© saicle/Shutterstock.com
PHP Magazin
Dependency Injection und Service Locators im Einsatz

Mach dich frei!

Endlich ist es da. Nach fünf Jahren Entwicklung wurde die erste stabile Version von Zend Framework 2 veröffentlicht. Auch wenn viele der Komponenten noch vom Vorgänger bekannt sind, dürfte den meisten Entwicklern schnell klar werden, dass sich etwas grundlegend geändert hat.

Andreas Baumgart


Die von Altmeister Martin Fowler propagierten und zunächst hauptsächlich in der Java- und .NET-Welt verbreiteten Entwurfsmuster Dependency Injection und Service Locators [1] sind nun das Mittel der Wahl, wenn es um die Verwaltung von Abhängigkeiten geht. Und weil das flexible Spiel mit Komponenten und Plug-ins eine der Stärken des Frameworks ist, werden diese bis vor Kurzem unter PHP-Entwicklern noch recht unbekannten Entwurfsmuster nun zu einem zentralen Baustein für das Design von Zend-Framework-Anwendungen.

Das Problem mit der Abhängigkeit

Ein Großteil der strukturellen Änderungen, die Zend Framework 2 erfahren hat, lässt sich auf eine ganz grundlegende Fragestellung zurückführen. Sie ist eigentlich essenziell für objektorientierte Entwicklung, wird doch erst seit einiger Zeit in der PHP-Welt diskutiert: Wie erfüllt man idealerweise die Abhängigkeiten einer Klasse von anderen Klassen, ohne dabei die Erweiterbarkeit und Portabilität zu blockieren? Wann sich diese Frage überhaupt stellt und warum die Antwort darauf letztendlich eine wichtige Designentscheidung in einer Softwarearchitektur ist, wird im Folgenden anhand eines einfachen Beispiels (Listing 1) diskutiert.

Listing 1: Implementierung einer Warteschlangestorage = new FileStorage(); }  public function next() { $jobs = $this->storage->read(); $res = array_pop($jobs); $this->storage->write($jobs); return $res; }  public function append($job) { $jobs = $this->storage->read(); $jobs[] = $job; $this->storage->write($jobs); }} // MyModule/src/MyModule/Queue/FileStorage.phpnamespace MyModule\Queue; class FileStorage{ protected $filename;  public function __construct() { $this->filename = dirname(__FILE__) . '/../../tmp/queue'; }  public function read() { $data = @file_get_contents($this->filename); if (false === $data) { $data = array(); } else { $data = unserialize($data); } return $data; }  public function write(array $jobs) { file_put_contents($this->filename, serialize($jobs)); }} // MyModule/src/MyModule/Controller/QueueController.phpnamespace MyModule\Controller; use \Zend\Mvc\Controller\AbstractActionController; class QueueController extends AbstractActionController {  public function createJobAction() { $queue = new Queue\Queue();  $job = $this->processUserInput(); $qu...

PHP Magazin
Dependency Injection und Service Locators im Einsatz

Mach dich frei!

Endlich ist es da. Nach fünf Jahren Entwicklung wurde die erste stabile Version von Zend Framework 2 veröffentlicht. Auch wenn viele der Komponenten noch vom Vorgänger bekannt sind, dürfte den meisten Entwicklern schnell klar werden, dass sich etwas grundlegend geändert hat.

Andreas Baumgart


Die von Altmeister Martin Fowler propagierten und zunächst hauptsächlich in der Java- und .NET-Welt verbreiteten Entwurfsmuster Dependency Injection und Service Locators [1] sind nun das Mittel der Wahl, wenn es um die Verwaltung von Abhängigkeiten geht. Und weil das flexible Spiel mit Komponenten und Plug-ins eine der Stärken des Frameworks ist, werden diese bis vor Kurzem unter PHP-Entwicklern noch recht unbekannten Entwurfsmuster nun zu einem zentralen Baustein für das Design von Zend-Framework-Anwendungen.

Das Problem mit der Abhängigkeit

Ein Großteil der strukturellen Änderungen, die Zend Framework 2 erfahren hat, lässt sich auf eine ganz grundlegende Fragestellung zurückführen. Sie ist eigentlich essenziell für objektorientierte Entwicklung, wird doch erst seit einiger Zeit in der PHP-Welt diskutiert: Wie erfüllt man idealerweise die Abhängigkeiten einer Klasse von anderen Klassen, ohne dabei die Erweiterbarkeit und Portabilität zu blockieren? Wann sich diese Frage überhaupt stellt und warum die Antwort darauf letztendlich eine wichtige Designentscheidung in einer Softwarearchitektur ist, wird im Folgenden anhand eines einfachen Beispiels (Listing 1) diskutiert.

Listing 1: Implementierung einer Warteschlangestorage = new FileStorage(); }  public function next() { $jobs = $this->storage->read(); $res = array_pop($jobs); $this->storage->write($jobs); return $res; }  public function append($job) { $jobs = $this->storage->read(); $jobs[] = $job; $this->storage->write($jobs); }} // MyModule/src/MyModule/Queue/FileStorage.phpnamespace MyModule\Queue; class FileStorage{ protected $filename;  public function __construct() { $this->filename = dirname(__FILE__) . '/../../tmp/queue'; }  public function read() { $data = @file_get_contents($this->filename); if (false === $data) { $data = array(); } else { $data = unserialize($data); } return $data; }  public function write(array $jobs) { file_put_contents($this->filename, serialize($jobs)); }} // MyModule/src/MyModule/Controller/QueueController.phpnamespace MyModule\Controller; use \Zend\Mvc\Controller\AbstractActionController; class QueueController extends AbstractActionController {  public function createJobAction() { $queue = new Queue\Queue();  $job = $this->processUserInput(); $qu...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang