2015-05-30 5 views
2

В моей среде dev после добавления прослушивателя ответов тип содержимого моих файлов css переключился с текста/css на текст/html. Моя цель - просто добавить некоторые заголовки кеширования ко всем ответам моего приложения symfony. определениеИзменения в ResponseListener Content-Type of assets

Услуги:

response_listener: 
    class: AppBundle\EventListeners\ResponseListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.response } 

Класс обслуживания:

<?php 

namespace AppBundle\EventListeners; 

use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 

class ResponseListener 
{ 
    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     // while testing I do nothing special here 
     $response = $event->getResponse(); 
     $event->setResponse($response); 
    } 
} 

Assetic конфигурации:

assetic: 
    debug:   "%kernel.debug%" 
    use_controller: true 
    bundles:  [ AppBundle ] 
    filters: 
     cssrewrite: ~ 

Twig тег:

{% stylesheets 
    'bundles/app/css/login.css' 
    filter='cssrewrite' %} 
    <link rel="stylesheet" type="text/css" href="{{ asset_url }}"/> 
{% endstylesheets %} 

С текстом/HTML в качестве содержимого введите CSS не отображается. Удаление только определения сервиса заставляет его работать снова. В среде prod он работает с прослушивателем ответа или без него, а js-файлы вообще не представляют проблемы.

Любые идеи?

ответ

1

У меня была очень похожая проблема, и хотя я не собирался отслеживать ее точно на основных связях symfony, я думаю, это связано с тем, что на этапе разработки assetic используют контроллер для визуализации CSS.

я фактически перестал смотреть на данный момент я обнаружил, что, как ты, мой config_dev.yml заявил:

assetic: 
    use_controller: true 


Так я понял, что, когда вы пытаетесь играть с объектом ответа в Symfony, то запрошенный формат как-то теряется при прослушивании ответа. Symfony's own ResponseListener похоже set text/html as a defaullt т.к. нет контента определенный.

Исправление довольно легко, хотя:
В классе ResponseListener, наша функция прослушивания стала

public function onKernelResponse(FilterResponseEvent $event) 
{ 
    $response = $event->getResponse(); 

    // We do get the params of the route 
    $route_params = $event->getRequest()->get('_route_params'); 

    // And we figure out if it should be in a specific format 
    if(isset($route_params['_format'])) { 

     // getMimeType function on the Request object come in handy for this job 
     $format = $event->getRequest()->getMimeType($route_params['_format']); 

     // Then we just reinstate the right Content Type 
     $response->headers->set('Content-Type', $format); 
    } 
    $event->setResponse($response); 
} 

Хотя вы никогда не будете иметь эту проблему в производстве Environnement, как вы утверждаете, потому что ваши активы сброшены инструмент командной строки командной строки, который не является контроллером.

И на самом деле, если вы делаете что-то подобное в вашем ResponseListener

die($event->getRequest()->get('_controller')); 

И что вы ориентируетесь в файл CSS по своему прямому URL вы увидите этот экран:

assetic.controller:render

Который полностью подтверждает факт создания css на летуrender вид Контроллер ассемблерного комплекта, если у вас есть указанная выше конфигурация.

+1

Абсолютно правильно, я проследил его, чтобы произойти, когда событие обработано. Это своего рода ошибка. Я отредактирую вашу беседу, чтобы включить точную строку, где это происходит. –

+0

Хорошее копание в корне проблемы –