2017-03-07 139 views
0

我已经为我的应用程序设置了日记服务。这个想法是将服务注入到我的控制器(通过工厂),然后根据需要调用diaryEntry方法将日记条目存储到dB中。我遇到的问题是,如果我在控制器操作中多次调用该方法,我只能获取存储在dB中的最后一个条目。这里是DiaryService :: diaryEntry -ZF2主义服务 - 多次呼叫

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; 
} 

在控制器的行动我再有这样的事情:

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

问题只味精2得到保存在分贝,味精1没有被保存。最后一次更新是在diaryEntry方法的末尾添加flush,但这没有什么区别。有没有人有任何想法,我coudl开始寻找解决这个问题?这是不好的架构,也许不适合作为服务,应该利用别的东西吗?

我很高兴地粘贴应用

预先感谢您的任何援助所需的任何进一步的代码

回答

1

这将有助于更多,如果你发布的是如何$this->projectDiaryEntity初始化信息,但我敢打赌,你注入日记实体对象通过工厂,所以你的所有操作都是在同一个对象上完成的。

试着用这个替换您的线路: $ProjectDiary = clone $this->projectDiaryEntity;

您的方法并不好看但它很难说,你应该基于一个方法的几行改变什么。

如果您的默认status1,您可以在您的实体类中进行设置。时间戳也一样。

+0

嗨SzymonM,确实我通过工厂注入日记对象,你说什么是有道理的,它的工作原理!谢谢你,我已经接受并投了票。我们试图在控制器中克隆服务等,但从来没有在实际服务中使用。 – JamesB

+0

**谨防**:默认情况下,PHP不会进行深度克隆,这意味着如果克隆实体的属性指向另一个实体或对象,则不会被克隆。你可能想看看[这个答案](http://stackoverflow.com/questions/14158111/deep-clone-doctrine-entity-with-related-entities)和[这个库](https://github.com/myclabs/deepcopy的)。 – edigu