我在我的Symfony 3应用程序中启用了ESI,我将其用于app_dev.php
:
$kernel = new AppKernel('dev', true); $kernel = new AppCache($kernel);
现在我有config.yml
:
framework: esi: { enabled: true } fragments: { path: /_fragment }
在我的控制器中:
/** * @Route("/foo/bar/{fooId}", name="AppBundle_Foo_bar") */ public function barAction(int $fooId, Request $request) { //some database querying from repositroy $response = $this->render('AppBundle:Foo:bar.html.twig',['foo' => $foo]); $response->setETag(md5($response->getContent())); $response->setPublic(); $response->isNotModified($request); return $response; }
这是bar.html.twig
我要缓存的view(),如下所示:
{{foo}}
现在,我有另一种渲染主视图的方法.
/** * @Route("/baz/{fooId}", name="AppBundle_Foo_baz") * @Template */ public function bazAction(int $fooId) { return [ 'fooId' => $fooId ]; }
我baz.html.twig
看起来像:
{% extends 'AppBundle::layout.html.twig' %} {% block content %} {{ render_esi(controller('AppBundle:Foo:bar', { 'fooId': fooId })) }} {% endblock content %}
所以我想主要有非缓存视图(baz)并barAction()
在其中嵌套并缓存它.
但是,我得到了:
Cache-Control:must-revalidate, no-cache, private
即使我明确地将其设置为公开,我得到:
X-Symfony-Cache:GET /baz/1: miss;
每次刷新页面我得到:
GET /_fragment?_hash=aO.....Details: stale, invalid, store
如果我刷新无效就变得有效.但是我无法设置缓存.
编辑:
我读到了ESI和验证缓存,似乎它们不能一起工作.所以我尝试了验证缓存并添加了
$response->setSharedMaxAge(15); $response->headers->addCacheControlDirective('must-revalidate', true);
而不是ETag.并且结果仍然相同......