Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2-后刷新事件_Symfony - Fatal编程技术网

Symfony2-后刷新事件

Symfony2-后刷新事件,symfony,Symfony,我设置了一些东西,通过一个表单,您可以向我的数据库添加警报。添加此警报时,postFlush事件接收该警报并对其执行任务。这一切都非常有效 我现在改变了一切。我没有通过表单添加警报,而是显示所有可能的警报。然后,他们可以选择他们想要的任何警报,并将其添加到数据库中。因此,以前一次只添加一个警报,现在可以添加多个警报 所以现在的问题是,在我的控制器中,使用foreach添加了一个警报 foreach ($data as $flightNum=>$seat) { $alert = ne

我设置了一些东西,通过一个表单,您可以向我的数据库添加警报。添加此警报时,postFlush事件接收该警报并对其执行任务。这一切都非常有效

我现在改变了一切。我没有通过表单添加警报,而是显示所有可能的警报。然后,他们可以选择他们想要的任何警报,并将其添加到数据库中。因此,以前一次只添加一个警报,现在可以添加多个警报

所以现在的问题是,在我的控制器中,使用foreach添加了一个警报

foreach ($data as $flightNum=>$seat) {
    $alert = new Alert();
    $alert->setLastUpdated();
    $alert->setIsDeleted(0);
    $alert->setAlertStatus('Active');

    $flightNumber = new FlightNumbers();
    $flightNumber->setAvailabilityAlert($alert);
    $flightNumber->setFlightNumber($flightNum);
    $alert->addFlightNumber($flightNumber);
    $em->persist($flightNumber);

    $em->persist($alert);
    $em->flush();
}
问题是,我的postFlush现在似乎只对添加的第一个警报执行。因此,如果我选择三个警报,第一个警报会对其执行额外的postFlush操作,但其他两个警报不会

我已经试着用postFlush来代替数组,但似乎不起作用

class AlertListener
{
    protected $api_service;
    protected  $alertEntity = array();
    protected $em = null;

    public function __construct(UapiService $api_service)
    {
        $this->api_service = $api_service;
    }

    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        if ($entity instanceof Alert) {
            array_push($this->alertEntity, $entity);
            var_dump("TEST");
        }
    }

    public function postFlush(PostFlushEventArgs $args)
    {
        $this->em = $args->getEntityManager();
        $eventManager = $this->em->getEventManager();
        $eventManager->removeEventListener('postFlush', $this);

        \Doctrine\Common\Util\Debug::dump($this->alertEntity);

        if (!empty($this->alertEntity)) {
            foreach($this->alertEntity as $alert) {
                $this->api_service->addFlightsAction($alert);
            }
        }

    }
}
有趣的是,如果我选择2个警报,var_dump会输出两次,这让我相信向阵列添加了正确数量的警报

但是,对象的Symfony2转储只输出一个警报,因此显然不是。有趣的是,如果我在postPersist函数中转储数组,就会得到列出的大量警报。如果我在postFlush函数中转储,则只输出一个警报

我如何处理这里的多个警报


谢谢

首先,为了性能起见,不应该在循环内刷新,而应该在循环外刷新,然后从PostFlushEventArgs获取Postflush事件中的警报数组,然后根据需要使用它们。

谢谢,这似乎解决了我面临的总体问题。当坚持循环内和循环外刷新时,预警原则并不像预期的那样有效,至少对于插入。给我带来了一个讨厌的虫子。请参阅以下说明:在这种情况下,您只需使用批处理大小来限制发送到DB server的查询,因为我们不会将插入分组到一个插入中,而是将它们划分为多个插入。但是,使用flush every insert作为其性能杀手是不可行的,已经用flush inside loop和flush outside进行了尝试,它在外部速度更快。