【问题标题】:Symfony2 Doctrine event listener prePersist not workingSymfony2 Doctrine 事件监听器 prePersist 不工作
【发布时间】:2013-07-01 17:56:11
【问题描述】:

我在实现 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();
            }
        }
    }
}

报告监听器

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 }

【问题讨论】:

    标签: symfony doctrine-orm event-listener


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在您的控制器中缺少 $form->handleRequest($request); ,否则请求中的值不会分配给您的发票对象。

      在您的侦听器上,您无需再次保存并刷新您的 Invoice,您只需设置所需的属性。

      【讨论】:

      • 哦,对不起,我的错误,很遗憾我省略了这一行:$form->bindRequest($request),反正给你投票
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多