2010-09-29 15 views
9

Ho una domanda relativa a Doctrine 2 e Zend Framework.Dove dovrebbe essere posizionata la logica aziendale quando si utilizza Doctrine 2 e Zend Framework

Se si utilizza Zend Framework senza Doctrine, per impostazione predefinita si inserisce la logica di business nei modelli. Ma come Doctrine 2 ha Entità dove dovrebbe essere collocata la logica aziendale?

Prima ho creato modelli in cui il gestore di entità ha effettuato chiamate alle entità. Ma quando volevo scrivere test unitari per i miei modelli senza chiamate al database. Avevo bisogno di spostare l'entity manager sui controller. Ma ho una logica di business nei miei controller che non va bene.

Il codice seguente mostra una parte di un'azione di controllo:

 $customerAddress = $this->_model->save($values, $id); 

     $this->_em->persist($customerAddress); 

     // Update default billing address 
     $defaultBilling = $this->_model->saveDefaultBilling($values, $customerAddress); 
     if ($defaultBilling != FALSE) { 
      $this->_em->persist($defaultBilling); 
     } 

     // Update default shipping address 
     $defaultShipping = $this->_model->saveDefaultShipping($values, $customerAddress); 
     if ($defaultShipping != FALSE) { 
      $this->_em->persist($defaultShipping); 
     } 

     $this->_em->flush(); 

Qualcuno può dire che cosa è la pratica migliore per questo problema? Thx

+0

penso che sia meglio che tutto il codice dottrina è spostato fuori di controllori e nelle classi di dominio, si prega di controllare il mio post sul blog: http://www.cobbweb.me/2010/11/integrate-doctrine- 2-zend-framework-application/ – Cobby

risposta

13

Non sono sicuro che ci sia una best practice concordata, ma vedo parlare molto dei livelli di servizio quando si discute di Doctrine o Zend Framework.

Quando ho iniziato la mia app con Doctrine, ho cercato di costruire il più funzionalità nei miei oggetti entità come ho potuto, ma subito capito che è quasi impossibile senza l'iniezione di Entity Manager, che rompe totalmente l'idea di pianura, non la persistenza -oggetti che rendono Doctrine 2 così bello.

Se provieni da un mondo Active Record, è facile pensare al tuo 'modello' come singolo oggetto che corrisponde a una tabella di database e che i controller devono parlare con questi oggetti. Questo di solito è ok per applicazioni CRUD molto semplici. Ma a causa dell'approccio di Doctrine, farlo in quel modo è strano e frustrante.

Invece, pensa ai diversi livelli nella tua applicazione. Doctrine è un livello che si trova in cima al database, le tue Entità si trovano in cima a Doctrine e il tuo livello di servizio deve stare in cima alle tue Entità. L'intero pacchetto è il tuo M in MVC e comprende sia la persistenza dei dati sia la logica di business.

Ti suggerisco di dare un'occhiata a questo presentation sull'argomento.

UPDATE

Originariamente ho perso la parte in cui è menzionato avevi oggetti del modello separati effettuare le chiamate alle Entità. Penso che sarebbe uno schema accettabile da usare. Se vuoi scrivere dei test senza effettuare chiamate al database, probabilmente vorrai usare una simulazione dell'Ente Manager - è una dipendenza indipendentemente dal livello in cui lo hai inserito.

+0

Penso che il trucco qui sia quello di progettare il modello in modo che sia persistente agnostico, vale a dire che avrebbe potuto essere istanziato interamente richiamando tutto da capo e impostando le proprietà da valori letterali.Ogni oggetto necessario in ogni collaborazione dovrebbe quindi essere accessibile attraversando il grafico dell'oggetto (attraverso i riferimenti all'oggetto creati dai mapping delle relazioni di doctrine), quindi il gestore dell'entità non dovrebbe essere necessario nelle entità. –

Problemi correlati