Symfony2:在RedirectResponse中设置Last-Modified

时间:2016-11-25 11:47:36

标签: php symfony http-headers

这就是我所拥有的:

我有一条路线,我称之为服务来旋转给定的图像。

/**
 * @Route("/media/rotate/{id}", name="rotate_image")
 *
 * @ParamConverter(name="media", class="RA\MediaBundle\Entity\Media")
 *
 * @param Media $media
 *
 * @return RedirectResponse
 */
public function rotateImage(Media $media)
{
    $this->get('ra.image.rotator.service')->rotateImage($media, 90);

    // do the redirect
}

这就是我想做的事情:

对我来自的路线进行重定向(在referer的帮助下)。 这确实有效,但在重定向后,旋转的图像不会显示,因为它已被缓存。

所以我想设置" Last-Modified"在当前DateTime的标题中会强制浏览器重新加载图像。 我尝试按以下方式进行:

    if ($referer = $request->headers->get('referer')) {
        $response = new RedirectResponse($referer);
        $response->setLastModified(new \DateTime());

        return $response;
    }

但不幸的是" Last-Modified"只在rotate_image路径的标题中设置,而不是在我重定向到的那个。

知道如何解决这个问题吗?

修改

我已经解决了#34;我的问题只是将一个版本参数添加到媒体网址,如下所示:

return $mediaUrl . '?v=' . md5($media->getUpdatedAt()->format('Y-m-d H:i:s'));

因此,在旋转图像之后,我更新了媒体实体,以便版本发生变化,并且" new"图像将显示。

1 个答案:

答案 0 :(得分:0)

将图像列表的逻辑放在控制器中并使用twig函数“render”创建子请求,如:{{render(controller('AppBundle:ImageController:index',{'media':media}))} }

您可以为“kernel.response”创建事件侦听器。看一下symfony.com/doc/current/event_dispatcher.html用它修改响应的标题。也许检查您图像的上次修改时间戳。