如何向Twig生成的内容注入内容?

时间:2013-11-24 14:12:19

标签: symfony twig

我希望在解析完所有内容之后将内容注入到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,在这种情况下我没有操纵内容)

1 个答案:

答案 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,流或其他内容。