在标题中渲染Twig模板(位置)

时间:2017-03-30 14:51:09

标签: symfony http-headers twig

更新:我正在使用流程功能在Symfony框架中创建长时间运行的后台任务。作为其中一部分: - 用户将填写表单并单击“提交”按钮 - 这将使用以下脚本

启动后台进程
$rootDir = $this->get('kernel')->getRootDir();
$adk_process = new Process('php ../bin/console app:adkaction ' . $numcampaigns . ', ' . $timezone . ',' . $depdate);
$adk_process->setWorkingDirectory($rootDir);
$adk_process->setTimeout(null);
$adk_process->start();

为了让用户能够做其他事情,我们关闭当前会话并希望渲染特定的twig tempalate并使用下面的代码将特定变量传递给它

$ignore_user_abort(true);
$strURL = $rootDir;
header("Location: " . $strURL, false);
header("Connection: close", true);
header("Content-Encoding: none");
header("Content-Length: 0", true);
flush();
ob_flush();
session_write_close();

这很好但是我似乎找不到如何以这种方式传递变量的方法。我的Twig模板就像这样

{% if currprogress is defined %}
<div class="col-md-4 col-sm-4 col-xs-12">
    <div class="x_panel">
        <div class="x_title">
            <div class="progress">
                <div class="progress-bar progress-bar-striped active"
                    role="progressbar" aria-valuenow={{currprogress}}
                    aria-valuemin="0" aria-valuemax="100" style="width:{{currprogress}}%">
                    Campaign Generation - {{currprogress}}%
                </div>
            </div>
        </div>
    </div>
</div>
{% endif %}

因此,一旦currprogress变量值传递给Twig,它就会略有变化。关于如何使用标题+链接做任何想法。

1 个答案:

答案 0 :(得分:0)

我已将JMSJobQueueBundle用于此目的。

在您的控制器中,创建一个新作业:

use JMS\JobQueueBundle\Entity\Job;

public function adkAction(Request $request)
{
    $job = new Job('app:adkaction', [
        'numcampaigns' => $request->request->get('numcampaigns'),
        //...timezone, etc.
    ]);

    $em = $this->getDoctrine()->getManager();
    $em->persist($job);
    $em->flush();

    return Response('Ok, job scheduled!');
}

按照文档中的说明配置JMSJobQueueBundle,以便命令在保留后运行。

在您的工作中,将进度保存到数据库,内存,文件或任何您认为有用的内容:

class FooBarCommand extends ContainerAwareCommand
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $entityManager = $this->getContainer()->get('doctrine')->getManager();
        $someEntity = new SomeEntity($input->getArgument('numcampaigns'));

        $someEntity->setProgress(5);
        $entityManager->persist($someEntity);
        $entityManager->flush();

        //do something

        $someEntity->setProgress(5);
        $entityManager->persist($someEntity);
        $entityManager->flush();

        //do something else

        $someEntity->setProgress(100);
        $entityManager->persist($someEntity);
        $entityManager->flush();
    }
}

现在,您的工作将保存数据库中的进度,因此您可以创建一个控制器Action,用于查找该Job并使用它来修改进度条。