我正在使用sonata admin bundle处理symfony2项目。
我有一个大的pdf,包含在表单输入和写入数据库后生成的图像。 我在持久化数据结束时开始生成pdf。之后用户被重定向。
我的计划:我想在将数据保存到数据库后触发pdf生成。但重定向正在等待pdf文档准备就绪。这需要很长时间。因此,重定向应该完成,同时应该触发pdf生成在后台运行。
如果成功创建了pdf,则标题中应显示通知消息。
PDF生成是使用DOMPDF完成的。所以它直接在php中完成,而不是使用单独的命令行工具。
有人想过如何实现这个?
我正在考虑重定向完成后的ajax请求。这是一个好方法吗?
答案 0 :(得分:0)
您是否考虑过使用活动?
你可以写一个这样的事件:
class PdfGeneratorListener
{
public function onPdfReady(EventInterface $event)
{
// create pdf or whatever
}
}
在你决定时调用它:
$eventDispatcher->notify(new Event($pdfcontent, 'pdf.ready'));
答案 1 :(得分:0)
我终于通过以下方式修复了我的问题:
注册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();
}
创建acme:pdfgenerator:write命令:创建一个命令,将其执行到终端,处理最终的pdf创建。使用给定的主题id调用此命令。在查找有效主题的数据库之后,它将生成pdf并将其放入文件系统。
使用JobQueue:安装并启动一个简单的JobQueue(我使用JMSJobQueueBundle)。
app/console jms-job-queue:run # To start listing to the job queue
可选:我实现了一个获取给定作业状态的ajax请求。因此,如果文档创建完成,用户将收到一条flash消息。
现在像魅力一样工作。 pdf创建将在一个单独的过程中执行,用户无需等待几秒就能看到下一页。