在symfony2应用程序中重定向到下一页时异步PDF生成?

时间:2013-10-01 17:41:33

标签: php ajax symfony pdf-generation sonata-admin

我正在使用sonata admin bundle处理symfony2项目。

我有一个大的pdf,包含在表单输入和写入数据库后生成的图像。 我在持久化数据结束时开始生成pdf。之后用户被重定向。

我的计划:我想在将数据保存到数据库后触发pdf生成。但重定向正在等待pdf文档准备就绪。这需要很长时间。因此,重定向应该完成,同时应该触发pdf生成在后台运行。

如果成功创建了pdf,则标题中应显示通知消息。

PDF生成是使用DOMPDF完成的。所以它直接在php中完成,而不是使用单独的命令行工具。

有人想过如何实现这个?

我正在考虑重定向完成后的ajax请求。这是一个好方法吗?

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用活动?

你可以写一个这样的事件:

 class PdfGeneratorListener
{
    public function onPdfReady(EventInterface $event)
    {
        // create pdf or whatever
    }
}

在你决定时调用它:

$eventDispatcher->notify(new Event($pdfcontent, 'pdf.ready'));

答案 1 :(得分:0)

我终于通过以下方式修复了我的问题:

  1. 注册EventListener:使用EventDispatcher通知一个特殊事件,其中主题(offer,order ...)被注入。根据主题,将呈现pdf文档。

    public function onOfferUpdate(OfferEvent $event)
    {
      $offer = $event->getOffer();
      $em = $this->container->get('doctrine')->getEntityManager();
    
      $job = new Job('acme:pdfgenerator:write', array('--entity="'.get_class($offer).'"', '--id='.$offer->getId()));
      $job->addRelatedEntity($offer);
      $em->persist($job);
      $em->flush();
    }
    
  2. 创建acme:pdfgenerator:write命令:创建一个命令,将其执行到终端,处理最终的pdf创建。使用给定的主题id调用此命令。在查找有效主题的数据库之后,它将生成pdf并将其放入文件系统。

  3. 使用JobQueue:安装并启动一个简单的JobQueue(我使用JMSJobQueueBundle)。

    app/console jms-job-queue:run  # To start listing to the job queue
    
  4. 可选:我实现了一个获取给定作业状态的ajax请求。因此,如果文档创建完成,用户将收到一条flash消息。

  5. 现在像魅力一样工作。 pdf创建将在一个单独的过程中执行,用户无需等待几秒就能看到下一页。