我希望在解析完所有内容之后将内容注入到Twig生成的内容中。
现在我正在使用以下代码:
public function onResponse(KernelEvent $event)
{
// TODO: find a better way to inject
$event->getResponse()->setContent(
$this->asseticProcessor->inject($event->getResponse()->getContent()));
}
public static function getSubscribedEvents()
{
return array(
KernelEvents::RESPONSE => array('onResponse', -9999),
);
}
但是,我觉得这可能不是最佳方式。首先,至少我只想在实际渲染Twig HTML模板时进行注入(在某些情况下,控制器可以简单地返回响应而不渲染任何东西,或者它们可以渲染json,在这种情况下我没有操纵内容)
答案 0 :(得分:0)
这里的聚会晚了,但你可以使用内核事件监听器。例如:
services:
response_modifier:
class: Some\Bundle\Listener\ModifyResponseListener
tags:
- { name: kernel.event_listener, event: kernel.response, method: onKernelResponse, priority: -127 }
将优先级设置得非常低,以便它向响应链的方向触发。听众可能会这样工作:
class ModifyResponseListener
{
public function onKernelResponse(FilterResponseEvent $event)
{
// We probably want to ignore sub-requests
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$content = $response->getContent();
$content = preg_replace('/foo/is', 'bar', $content);
$response->setContent($content);
}
}
以上内容将在最终输出中用“bar”替换所有出现的“foo”。
请注意,在修改内容之前,您可能还必须检查响应是否为重定向,ajax,流或其他内容。