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

时间:2016-04-28 08:55:17

标签: symfony controller

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

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]);

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

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

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

我建议您使用JMSJobQueueBundledocumentation)。简而言之,这是做什么的:

  1. 创建一个控制台命令来处理您想要的操作;
  2. 使用您的控制器,听众或任何create a job
  3. def multiply_opt(x, y) # Not sure if this base case is correct... return x * y if x.to_s.length <= 1 || y.to_s.length <= 1 # Not sure exactly how to define n n = [x.to_s.length, y.to_s.length].max k = (n+1) / 2 x_mid = x.to_s.length - k y_mid = y.to_s.length - k a = x.to_s[0..x_mid-1].to_i b = x.to_s[x_mid..-1].to_i c = y.to_s[0..y_mid-1].to_i d = y.to_s[y_mid..-1].to_i # Recursive Calls s1 = multiply_opt(a,c) s2 = multiply_opt(b,d) s3 = multiply_opt((a + b),(c + d)) s4 = s3 - s1 - s2 (10**(2*k))*s1 + (10**k * s4) + s2 end

答案 1 :(得分:1)

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

答案 2 :(得分:0)

也许你可以尝试为活动添加一个监听器&#34; kernel.terminate&#34; (只有当治疗没有改变反应时)。