gpt4 book ai didi

symfony - ResponseListener 改变 Assets 的内容类型

转载 作者:行者123 更新时间:2023-12-04 08:48:32 25 4
gpt4 key购买 nike

在我的开发环境中添加响应监听器后,我的 css 文件的内容类型从 text/css 切换为 text/html。我的目标只是为我的 symfony 应用程序的所有响应添加一些缓存 header 。

服务定义:

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

Assets 配置:

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 %}

使用 text/html 作为内容类型时,不会呈现 css。仅删除服务定义即可使其再次正常工作。在 prod 环境中,它可以使用或不使用响应监听器,js 文件完全没有问题。

有什么想法吗?

最佳答案

我有一个非常相似的问题,虽然我没有在 symfony 的核心包上准确地追踪它,但我认为这是因为在开发实例中,assetic 确实使用 Controller 来呈现 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);
}

虽然您在生产环境中永远不会像您所说的那样遇到这个问题,因为您的 Assets 是由命令行 Assets 工具转储的,它不是 Controller 。

实际上,如果您在 ResponseListener

中执行类似的操作
die($event->getRequest()->get('_controller')); 

如果你通过它的直接 url 导航到一个 css 文件,你会看到这个显示:

assetic.controller:render

这完全验证了当您拥有该配置时,css 由 assetic bundle controllerrender View 动态构建的事实综上所述。

关于symfony - ResponseListener 改变 Assets 的内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com