Zend Framework 2 und Injections

Meine erste Reallife-Erfahrung mit dem ZF2 und Models war eine eher weniger positive. Das TableGateway braucht unbedingt den Service-Manager bzw den DB-Adapter daraus. Meine Vorgängerin hat sich dazu entschlossen eine Basis-Entität zu bauen, die wiederum von TableGateway ableitet und man so relativ einfach save() und
load()-Methoden in die Model-Klasse einbauen konnte. Der Service-Manager wurde dann durch den Constructor der Model-Klasse durch gereicht bis man den Constructor des TableGateways mit dem DB-Adapter aufrufen konnte. Auch zwischen durch wurde der Service-Manager immer mal benötigt. Weil.. man ohne ihn keine Instanz einer Model-Klasse bekommen konnte.
Um so eine Instanz zu bekommen wurde eine Factory verwendet:


'service_manager' => array(
'factories' => array(
/** Modelle laden */
'sModel' => function($sm) {
$model = new S\Model\S($sm);
return $model;
}
),

/**
* By default, the ServiceManager assumes all services are shared (= single instantiation),
* but you may specify a boolean false value here to indicate a new instance should be returned.
*/
'shared' => array(
'sModel' => false
)
)


Jedes mal aber die Factory zu bemühen eine neue Instanz zu erzeugen ist nicht gerade performant und mit den ganzen Ableitungen ist es auch sehr unübersichtlich. Ich wollte einfach schnell eine Instanz einer Model-Klasse haben und nicht ein riesiges Object bekommen. Also sowas wie in POPO .. eine POJO in PHP eben.
Ein Cosntructor ohne Argumente und eine Klasse nur mit Attributen ohne Logik. Also find ich an mir zu überlegen, ob diese ganzen Ableitungen überhaupt nötig sind oder man mit der Dependency-Injection nicht was viel besseres bauen könnte.

Ich bin dann schnell zu DAOs gwechselt. Die Factory injeziert einmal den Service-Manager und kann immer die selbe Instanz des DAOs liefern. Die DTO/Model-Klasse ist schön klein und beim Befüllen in Schleifen viel schneller als eine Intanz über die Factory anfordern zu müssen.

Meine Lösung ist momentan:


'service_manager' => array(
'factories' => array(
'sDAO' => function($sm) {
return new S\Model\DAO\SDAO($sm);
}
),
)



class SDAO extends TableGateway{
private $_tableName="s";
private $_sm=null;

public function __construct($serviceManager){
$this->_sm=$serviceManager;

parent::__construct(
$this->_tableName,
$serviceManager->get('dbAdapter')
);
}

.........
}


Man kann nun so damit Arbeiten:

echo "name: ".$this->getServiceLocator()->get('sDAO')->loadS($id)->getName();


Das ist eine der Stellen wo Konzepte aus de Java-Welt perfekt mit PHP und dem ZF2 zusammen arbeiten und einen großen Vorteil bringen.
User annonyme 2015-08-25 19:18

write comment:
Five + = 8

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?