我在实现Doctrine EventListener时遇到问题。创建新发票时,InvoiceType
表单中包含一系列项目(标题,价格,金额)。对于发票,在price
字段中,我想插入所有购买产品的总和。在ReportListener中,我得到了总和,但EventListener没有预先保存数据,代码只是停止而没有显示错误(程序在ReportListener中执行$entityManager->persist($entity)
时停止)
以下是一些代码
的 控制器
class InvoiceController extends Controller
{
public function createAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$company = $em->getRepository('DemoBundle:Company')
->findOneByUser($this->getUser()->getId());
$invoice = new Invoice();
$item = new Item();
$form = $this->createForm(new InvoiceType($company->getId()), $invoice);
if($request->isMethod('POST')){
if($form->isValid()){
$em->persist($invoice);
$em->flush();
}
}
}
}
的的ReportListener 的
namespace Demo\Bundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Demo\Bundle\Entity\Invoice;
class ReportListener
{
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$em = $args->getEntityManager();
$priceTotal = 0;
foreach ($entity->getItems() as $item)
{
$price = &$priceTotal;
$price += $item->getPrice() * $item->getAmount();
}
$entity->setPriceTotal($priceTotal); // this works
$em->persist($entity); // here code stops
$em->flush();
}
}
的 service.yml 的
report.listener:
class: Faktura\FakturaBundle\EventListener\ReportListener
tags:
- { name: doctrine.event_listener, event: prePersist }
答案 0 :(得分:9)
prePersist是一个被解雇的事件,你不必也不应该试图在那个事件中坚持并且不要自己冲洗,Doctrine会在它准备就绪时到达那里。基本上,只需删除最后几行:
$em->persist($entity); // here code stops
$em->flush();
答案 1 :(得分:3)
在您的控制器中缺少$form->handleRequest($request);
,否则请求中的值不会分配给您的发票对象。
在您的听众身上,您不需要再次保留并刷新您的发票,只需设置所需的属性即可。