更新Symfony 2.4:“只能在处理请求时才能渲染片段。”

时间:2014-02-10 17:40:12

标签: symfony request twig updating symfony-2.4

由于我迁移到Symfony 2.4,我收到以下错误消息:

  

只有在处理请求时才能渲染片段。

这种情况正在发生,因为在某些页面上,我通过执行$sf2->container->get('twig')->render("MyBundle::my-template.html.twig");在一些页面中使用Twig呈现一些模板,这些页面由另一个旧框架处理。

所以是的,Symfony 2没有处理这些请求是正确的,但我仍然想用Twig渲染这些模板!为什么我不能那样做(不再)?以及如何解决这个问题?

以下是我在旧项目中执行“启动”SF2的代码:

$loader = require_once __DIR__.'/../../../app/bootstrap.php.cache';
Debug::enable();
require_once __DIR__.'/../../../app/AppKernel.php';

$kernel = new AppKernel('bootstrap', true);
$kernel->loadClassCache();
Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$kernel->boot();
$kernel->getContainer()->enterScope('request');
$kernel->getContainer()->set('request', $request, 'request');
$this->container = $kernel->getContainer();

编辑:顺便说一下,它可能与此有关:Symfony 2.4 Rendering a controller in TWIG throws "Rendering a fragment can only be done when handling a Request." Exception。 虽然,我不想降级到Symfony 2.3,删除vendor目录并没有解决我的问题。

EDIT²:我发现问题是由于新的RequestStack

HttpKernel中,handleRaw(Request $request, $type = self::MASTER_REQUEST)通常会将请求推送到RequestStack($this->requestStack->push($request);)。因此,如果我向pushRequestStack($request)添加一个公共方法HttpKernel,那么它可行。但是我怎么能正确地做到这一点?我发现任何公共方法都无法从$requestStack获取HttpKernel(因此我可以在外部推送请求)..

我不能使用“普通”方法($kernel->handle($request))因为它会抛出一些例外,例如对于不存在的路由,或者对于已经由PHP ..

总之,有没有办法在没有完全处理请求的情况下将我/我的任何请求“推送”到requestStack?

2 个答案:

答案 0 :(得分:5)

您必须在" request_stack"中推送新请求。从你的Sf2命令。

 $this->getContainer()->get('request_stack')->push(Request::createFromGlobals());

答案 1 :(得分:0)

我遇到了同样的问题,并通过使用此命令重建引导程序解决了这个问题:

php vendor/bundles/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php app