2017-03-07 3 views
0

Ich habe einen Tagebuch-Service für meine Anwendung eingerichtet. Die Idee war, den Service in meine Controller (obwohl eine Fabrik) zu injizieren und dann die Methode diatryEntry aufzurufen, um Tagebucheinträge in den dB zu speichern. Das Problem, das ich habe, ist, dass ich nur den letzten Eintrag im dB gespeichert bekomme, wenn ich die Methode mehr als einmal in einer Controller-Aktion anrufe. Hier ist DiaryService :: diaryEntry -ZF2 Doctrine Service - Mehrere Anrufe

public function diaryEntry($projectUrn, $msg, $diaryCategory = 14) 
{ 
    $em    = $this->em; 
    $user   = $this->user; 
    $ProjectDiary = $this->projectDiaryEntity; 
    if(is_numeric($projectUrn)) { 
     $projectUrn = $em->find('Application\Entity\ProjectUrn', $projectUrn); 
    } 
    $ProjectDiary->setProjectUrn($projectUrn); 
    $ProjectDiary->setDiaryCategory($em->find('Application\Entity\DiaryCategory', $diaryCategory)); 
    $ProjectDiary->setStatus(1); 
    $ProjectDiary->setComment($msg); 
    $ProjectDiary->setUser($em->getRepository('Application\Entity\Users')->findOneBy(['username' => $user->username])); 
    $ProjectDiary->setTimestamp(new \DateTime()); 
    $em->persist($ProjectDiary); 
    $em->flush(); 
    return; 
} 

In einer Controller-Aktion dann habe ich so etwas wie diese:

$this->diaryService->diaryEntry($order->getProjectUrn(), 'test msg 1); 
$this->diaryService->diaryEntry($order->getProjectUrn(), 'test msg 2); 

Das Problem nur 2 msg in der dB gespeichert zu werden, msg 1 nicht zu sein Gerettet. Die letzte Aktualisierung bestand darin, den Flush am Ende der diaryEntry-Methode hinzuzufügen, aber das hat keinen Unterschied gemacht. Hat jemand Ideen, wo ich anfangen könnte, dieses Problem zu lösen? Ist es schlechte Architektur und vielleicht nicht als Service geeignet und sollte etwas anderes nutzen?

Ich bin glücklich, alle weiteren Code aus der App erforderlich einzufügen

Sie für jede Hilfe im Voraus Vielen

Antwort

1

Es wäre hilfreich, wenn Sie Informationen veröffentlichen, wie $this->projectDiaryEntity initialisiert wird, aber ich wette, Sie injizieren Tagebuch Entity Objekt durch Factory, so dass alle Ihre Operationen auf demselben Objekt durchgeführt werden.

Versuchen Sie, Ihre Linie mit diesem ersetzen: $ProjectDiary = clone $this->projectDiaryEntity;

Ihre Methode jedoch gut aussehen nicht, es ist schwer zu sagen, was Sie basiert auf wenigen Zeilen ein Verfahren ändern sollte.

Wenn Ihr Standard status1 ist, können Sie es in Ihrer Entitätsklasse festlegen. Dasselbe gilt für den Zeitstempel.

+0

Hallo SzymonM, ja ich Tagebuch Objekt durch Fabrik am injizierende und was Sie sagen, macht Sinn, und es funktioniert !! Danke freundlicherweise habe ich akzeptiert und abgestimmt. Wir hatten versucht, den Dienst im Controller usw. zu klonen, aber nie im eigentlichen Dienst. – JamesB

+0

** Vorsicht **: PHP nicht tief Klonen standardmäßig tut, Das bedeutet, wenn eine Eigenschaft eines geklonten Entität Punkte an ein anderes Unternehmen oder ein Objekt, wird es nicht geklont werden. Vielleicht möchten Sie prüfen, [diese Antwort] (http://stackoverflow.com/questions/14158111/deep-clone-doctrine-entity-with-related-entities) und [diese Bibliothek] (https://github.com/myclabs/DeepCopy). – edigu