2013-06-07 15 views
7

consideri che voglio essere in grado di salvare un utente al database, la mia azione add è la seguente:Zend Framewok 2, Doctrine 2 e dove fare affari logica in forma in

public function addAction() 
    { 

    $form = new UserForm(); 
    $form->get('submit')->setValue('Add'); 

    $request = $this->getRequest(); 

    if ($request->isPost()) { 

     $userFilter = new UserFilter(); 
     $form->setInputFilter($userFilter->getInputFilter()); 
     $form->setData($request->getPost()); 

     if ($form->isValid()) 

      $user = new User(); 
      $user->setEmail($form->getInputFilter()->getValue('email') ); 
      $user->setNome($form->getInputFilter()->getValue('name')); 


      $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
      $em->persist($user); 
      $em->flush(); 


      return $this->redirect()->toRoute('user'); 

     } 
    } 

    return array('form' => $form); 
    } 

Molto facile per salvare uno user to the databse, tuttavia se ho bisogno di aggiungere alcune logiche di business complesse, voglio controllare se l'email è unica e che voglio anche accedere ad alcuni servizi web per controllare che risponda alla domanda finale della vita, dell'universo, e tutto è veramente 42 e se è vero, voglio salvare l'utente nel database se non voglio mostrare un messaggio all'utente.

Si può aggiungere azione ma come mi è stato detto questa non è una buona pratica, posso inserire questa logica aziendale all'interno dell'entità Utente, ma ciò aggiungerebbe l'accoppiamento tra zf2 e doctrine con l'entità e questo è anche cattivo Cercando sul web una soluzione, la risposta sembra essere messa in una logica aziendale in Service Layer.

Fallowing la soluzione del livello di servizio, si creerebbe una classe UserBusinessLogic e si creerà un metodo di salvataggio che eseguirà la logica aziendale e salverà l'utente se tutto è ok.

Questo suono è corretto? C'è qualche documentazione sull'argomento? Forse un esempio di codice che mostra come gestire la logica aziendale usando doctrine 2 e zf2 e servizi.

Credo che la linea di fondo sia: qual è la migliore pratica su dove mettere la logica aziendale quando si usano zf2 e doctrine 2?

Supponendo che la soluzione di servizio sia la soluzione migliore. Se ho Entitys Users, Groups e la relazione tra questi due vorrei creare un servizio chiamato "access" e questo servizio sarebbe colui che riceve i dati dai controller per salvare gli utenti di un gruppo, collegarli 2 ed eseguire qualsiasi altra attività come invio di posta per reimpostare una password utente. Suona bene?

risposta

1

Hai l'idea giusta. Per rimuovere di nuovo Doctrine 2 puoi creare un altro livello che segue una delle interfacce in Zend \ Db, ma usa Doctrine per realizzare l'interazione con il database.

Inoltre, per la verifica è possibile creare filtri di input personalizzati per il modulo confrontato con il database utilizzando Doctrine.

L'idea è che qualunque cosa sia dietro al servizio può essere sostituita cambiando il servizio finché i nomi dei metodi rimangono gli stessi. In questo modo, ad esempio, è possibile sostituire Doctrine con Propel e non sarà necessario rifattorizzare le viste del controller &, solo la classe di servizio.

+1

sembra bello, ma molto più lavoro per avere qualcosa da mostrare. sarebbe bello se l'applicazione scheletro zf2 fosse un esempio di questa situazione – uacaman