2

自从我迁移到 Symfony 2.4 后,我收到以下错误消息:

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

发生这种情况是因为,在某些页面上,我在某些页面中使用 Twig 渲染了一些模板,这些模板由另一个较旧的框架处理,方法是$sf2->container->get('twig')->render("MyBundle::my-template.html.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 processing a Request." 例外。不过,我不想降级到 Symfony 2.3,删除vendor目录并不能解决我的问题。

EDIT²:我发现问题出在新的RequestStack上。

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

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

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

4

2 回答 2

6

您必须通过 Sf2 命令在“request_stack”中推送一个新请求。

 $this->getContainer()->get('request_stack')->push(Request::createFromGlobals());
于 2014-06-18T09:47:31.393 回答
0

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

php vendor/bundles/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php app
于 2014-02-28T13:14:36.877 回答