2013-06-07 7 views
7

Man bedenke, dass ich in der Lage sein wollen, um einen Benutzer zu der Datenbank zu speichern, meine Add Aktion ist wie folgt:Zend Framewok 2, Lehre 2 und dem Business-Logik fit machen 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); 
    } 

Sehr einfach ein sparen Benutzer auf die Datenbank, aber wenn ich einige komplexe Geschäftslogik hinzufügen muss, lasst mich überprüfen, ob E-Mail eindeutig ist und dass ich auch auf einige Web-Service zugreifen möchte, ist die Antwort auf die ultimative Frage des Lebens, des Universums und alles ist wirklich 42 und wenn es wahr ist, möchte ich den Benutzer in der Datenbank speichern, wenn ich dem Benutzer eine Nachricht anzeigen möchte.

Es kann getan werden Aktion hinzufügen, aber wie ich gesagt habe, ist dies keine sehr gute Praxis, ich kann diese Business-Logik in die Entität Benutzer setzen, aber dies würde die Kopplung zwischen der ZF2 und Lehre mit der Entität hinzufügen und das ist auch schlecht. Wenn man das Internet nach einer Lösung sucht, scheint die Antwort die Geschäftslogik in Service Layer zu sein.

Nach der Service Layer-Lösung würde man eine Klasse UserBusinessLogic erstellen und eine Methodenspeicherung erstellen, die die Geschäftslogik ausführen und den Benutzer speichern würde, wenn alles in Ordnung ist.

Klingt das richtig? Gibt es Unterlagen zu diesem Thema? Vielleicht ein Codebeispiel, das zeigt, wie man mit Geschäftslogik unter Verwendung von Doktrin 2 und zf2 und Diensten umgeht.

Ich denke, das Endergebnis ist: Was ist die beste Praxis, wo die Geschäftslogik bei der Verwendung von ZF2 und Doctrine 2 setzen?

Angenommen, die Servicelösung ist der beste Weg. Wenn ich Entitäten Benutzer, Gruppen und die Beziehung zwischen diesen beiden habe, würde ich einen Dienst namens "Zugriff" erstellen und dieser Dienst wäre derjenige, der Daten von Controllern erhält, um Benutzer eine Gruppe zu speichern, diese 2 zu verknüpfen und auch andere Aufgaben auszuführen Mail senden, um ein Benutzerpasswort zurückzusetzen. Klingt das richtig?

Antwort

1

Sie haben die richtige Idee. Um Doctrine 2 noch mehr zu entkoppeln, können Sie eine weitere Ebene erstellen, die einer der Schnittstellen in Zend \ Db folgt, aber Doctrine verwendet, um die Datenbankinteraktion durchzuführen.

Außerdem können Sie zur Überprüfung benutzerdefinierte Eingabefilter für das Formular erstellen, das Doctrine mit der Datenbank vergleicht.

Die Idee ist, dass alles, was hinter dem Dienst steht, durch Ändern des Dienstes ersetzt werden kann, solange die Methodennamen gleich bleiben. Auf diese Weise könnten Sie Doctrine später beispielsweise durch Propel ersetzen, und Sie müssten Ihre Controller & Views nicht einfach umgestalten, nur die Serviceklasse.

+1

sieht gut aus, aber viel mehr Arbeit, um etwas zu zeigen. es wäre schön, wenn die zf2-Skelett-Anwendung ein Beispiel für diese Situation wäre – uacaman