我想在我的控制器中执行一个操作,但在向用户呈现视图后,这里是我的控制器操作
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(文档)。简而言之,这是要做的:
- 创建处理所需操作的控制台命令;
- 使用控制器、侦听器或任何内容来创建作业:
$job = new Job('my-symfony2:command', array('some-args', 'or', '--options="foo"'));
发送响应/视图后,您可以使用 javascript 和 ajax mecanism 调用(从视图)远程 php 脚本
也许您可以尝试向事件"kernel.terminate"添加一个侦听器(仅当处理不会改变响应时)。