1

我正在使用奏鸣曲管理包进行 symfony2 项目。

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

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

如果 pdf 成功创建,标题中应出现通知消息。

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

有人知道如何实现这个吗?

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

4

2 回答 2

0

你有没有想过使用事件?

你可以这样写一个事件:

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

并在您决定时调用它:

$eventDispatcher->notify(new Event($pdfcontent, 'pdf.ready'));
于 2013-10-01T23:23:23.397 回答
0

我终于通过以下方式解决了我的问题:

  1. 注册 EventListener:使用 EventDispatcher 通知主题(报价、订单……)被注入的特殊事件。根据主题,将呈现 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 请求。因此,如果文档创建完成,用户会收到一条消息。

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

于 2013-11-06T17:35:42.470 回答