Symfony2 Doctrine 事件监听器 prePersist 不起作用

标签 symfony doctrine-orm event-listener

我在实现 Doctrine EventListener 时遇到问题。创建新发票时,InvoiceType 表单中包含一组项目(标题、价格、金额)。对于发票,在 price 字段中,我想插入所有购买产品的总和。在 ReportListener 中,我得到了总和,但 EventListener 没有预先保留数据,代码只是停止而不显示错误(程序在 ReportListener 中执行 $entityManager->persist($entity) 时停止)
这是一些代码
Controller

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 }

最佳答案

prePersist 是一个被触发的事件,您不必也不应该尝试在该事件中自己持久化和刷新,Doctrine 会在它准备好时到达那里。基本上,只需删除最后几行:

$em->persist($entity);                     // here code stops
$em->flush();

关于Symfony2 Doctrine 事件监听器 prePersist 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458228/

相关文章:

css - 应用程序/资源中的 Assets 未上课

Symfony2 : disable vendor event listeners

javascript - 为什么点击事件在两次点击后起作用 VANILLA

symfony - 没有为实体指定标识符/主键 (...) 每个实体都必须有标识符/主键

javascript - JS 函数设置过多的 addEventListeners

android - Jetpack 为键盘操作编写监听器(setOnKeyListener)(SMS 的文本字段)

symfony - EasyAdmin 3.X - 如何查看相关实体 `toString` 而不是列表中的关联数量?

php - Symfony 和 SwiftMailer 使用 starttls 发送

doctrine-orm - Doctrine 2 - 如何添加 CHECK .. IN 约束

php - bundle 如何为 Doctrine ORM 提供新的列类型?