Symfony2 在控制器中发送答案后执行操作



我想在我的控制器中执行一个操作,但在向用户呈现视图后,这里是我的控制器操作

public function addAction(Request $request)
{
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Vous n'avez pas les droits pour accéder à cette page' );
    $preconisation = new Preconisation();
    $form = $this->createForm(new PreconisationType($preconisation), $preconisation);
    if($request->isMethod('POST')) {
        $form->handleRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $rapport = $em->getRepository('DataBaseBundle:rapport')->findByIdRapport($preconisation->getRapport()->getIdRapport());
            $rapport[0]->incPreco($preconisation->getRapport()->getIdRapport());
            $em->persist($preconisation);
            $em->persist($rapport[0]);
            $em->flush();
            return $this->redirect($this->generateUrl('data_base_preconisation_index'));
        }
    }
    return $this->render('DataBaseBundle:Preconisation:add.thml.twig', array('form' => $form->createView(),'menu' => 1,
        'leftMenu' => 1,));
}

所以

我想在用户收到答案后执行此操作,以避免长时间充电

$rapport = $em->getRepository('DataBaseBundle:rapport')->findByIdRapport($preconisation->getRapport()->getIdRapport());
                $rapport[0]->incPreco($preconisation->getRapport()->getIdRapport());
                $em->persist($rapport[0]);

看到我可以使用侦听器和调度程序,但我并不真正了解他的结构或它是如何工作的。但我也看到了带有终止事件的 httpKernel。不幸的是,我没有答案。我不知道哪一个是最好的...

有什么建议吗?

侦听器是构建代码的好方法,但它不会加快应用程序的速度。如果要在向用户发送响应后执行代码,则必须使用 cron 作业或作业调度程序。

我可以推荐使用 JMSJobQueueBundle(文档)。简而言之,这是要做的:

  1. 创建处理所需操作的控制台命令;
  2. 使用控制器、侦听器或任何内容来创建作业:

$job = new Job('my-symfony2:command', array('some-args', 'or', '--options="foo"'));

发送响应/视图后,您可以使用 javascript 和 ajax mecanism 调用(从视图)远程 php 脚本

也许您可以尝试向事件"kernel.terminate"添加一个侦听器(仅当处理不会改变响应时)。

相关内容

最新更新