2012-11-11 19 views
9

Sto utilizzando Doctrine 2 in un'applicazione Zend Framework 2. C'è un modo per utilizzare ZF2 per iniettare dipendenze in entità restituite da Doctrine? Le entità sono costruite da Doctrine quando recuperate dal database. Per quanto ne so per iniettare le dipendenze in ZF2, ho bisogno di istanziare le entità usando Service Locator. Non riesco a vedere come posso integrarlo con Doctrine senza dover modificare il codice base di Doctrines. L'unica soluzione fattibile che riesco a vedere adesso è scrivere un piccolo servizio che prende il risultato restituito da Doctrine e inietta le dipendenze richieste. C'è una soluzione più elegante?ZF2 con Doctrine 2 - Iniezione di dipendenze nelle entità

migliori saluti Christian

+0

Cosa esattamente vuoi iniettare? Non riesco a pensare a un caso in cui abbia senso iniettare qualcosa in un'entità. Sono sicuro che c'è un modo per fare ciò che vuoi che rientri nel concetto. –

+0

Nel frattempo ho preso un'altra direzione. Le cose che volevo delegare alle entità stesse sono ora delegate a un servizio, che gestisce le entità. Quindi non c'è più bisogno di iniettare qualcosa nelle entità – griesi

risposta

16

esaminare la Dottrina EventManager, in particolare, l'evento postLoad ciclo di vita, che viene licenziato dal EventManager ogni volta che un'entità viene caricata dal database.

Per collegare tutto in ZF2, è necessario eseguire un paio di operazioni.

In primo luogo, dare una dottrina al gusto di listener di eventi:

<?php 
class InjectStuffListener { 
    private $sl; 

    public function __construct($serviceLocator){ 
     $this->sl = $serviceLocator; 
    } 

    public function postLoad($eventArgs){ 
     $entity = $eventArgs->getEntity; 
     $entity->setThingToBeInjected($this->sl->get('some.thing')); 
    } 
} 

Poi, in un posto come un Module.php (forse c'è un posto migliore di onBootstrap, ma qualunque cosa):

<?php 
public function onBootstrap(){ 
    $sm = $e->getApplication()->getServiceManager(); 
    $em = $sm->get('doctrine.entitymanager.orm_default'); 
    $dem = $em->getEventManager(); 
    $dem->addEventListener(array(\Doctrine\ORM\Events::postLoad), new InjectStuffListener($sm)); 

} 
+0

Sì, ma non riesco a vedere come potrei connetterlo con lo ZF2 service locator/service manager per iniettare dipendenze gestite da ZF2. L'entità stessa non conosce il localizzatore di servizio perché non viene istanziata attraverso il localizzatore di servizi. – griesi

+0

@griesi - vedere la mia modifica per un codice di esempio che inizializza i listener e li allega a EventManager di doctrine durante il bootstrap ZF2. – timdev

+0

Grazie per questo è esattamente che stavo cercando – griesi

Problemi correlati