2013-11-24 3 views
1

Я хотел бы добавить контент в контент, созданный 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

Не могли бы вы добавить дополнительные сведения к вашему вопросу pleae? что именно вы пытаетесь достичь? что вы подразумеваете под «введением содержимого в твиг»? – nifr

+0

hi nifr, мне нужно изменить самое окончательное содержание ответа на запрос (после всего разбора и т. Д. С помощью различных функций твига, фильтров). Поэтому мне нужно поймать эту финальную строку ответа и изменить ее до возвращения объекта ответа. – mr1031011

ответ

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); 
    } 
} 

выше будет заменить все вхождения «Foo» с «бар» в конечной продукции.

Обратите внимание, что вам также необходимо проверить, что ответ не является перенаправлением, ajax, потоком или чем-либо еще до изменения содержимого.

Смежные вопросы