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

4
我在实施Doctrine EventListener时遇到了问题。在创建新发票时,包含在InvoiceType表单中的项目集合(标题、价格和数量)。对于发票,我想在price字段中插入所有购买产品的总和。在ReportListener中,我获取总和,但是EventListener没有预存储数据,代码执行到$ 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 }
2个回答

9

prePersist是一个触发事件,您不必也不应在该事件中尝试持久化和刷新,Doctrine会在准备就绪时自动完成。基本上,只需删除最后几行即可:

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

3

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

在您的侦听器中,您不需要再次持久化和刷新您的发票,只需设置您想要的属性即可。


哦,我的错误,抱歉,不幸的是我忘记了这一行:$form->bindRequest($request),但还是给你投了票。 - 123dcck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接