【发布时间】:2018-09-05 09:51:19
【问题描述】:
我们的 Symfony 项目有一个登录小部件,有人告诉我应该通过 AJAX 加载它,以免弄乱页面缓存。
如果他已经登录,它会显示“登录”或用户电子邮件地址。
问题是,twig 模板也被缓存了!所以通过ajax加载它没有帮助。
如何告诉 Twig 每次都从头开始渲染我的模板,而不禁用站点范围内的缓存?
模板本身很简单:
<small id="login-username">
{% if is_granted('ROLE_USER') %}
{{ app.user.username }}
{% else %}
{{ 'LoginWidgetElement.login' | trans }}
{% endif %}
</small>
元素的类也很简单:
<?php
namespace Xyz\Sports\Element\LoginWidget;
use Xyz\Library\AbstractElement;
use Sensio\Bundle\FrameworkExtraBundle\Configuration as Config;
/**
* @Config\Template("@LoginWidgetElement/login_widget.html.twig")
*/
class LoginWidgetElement extends AbstractElement
{
public function render()
{
return [];
}
public function renderPreview()
{
return $this->render();
}
}
更新
twig 模板似乎正在检查,因此我尝试发送响应告诉浏览器不要缓存,但在变量更改之前仍然需要大约 15 个请求!!??
树枝缓存:
<small id=\"login-username\">
";
// line 9
if ($this->extensions['Symfony\Bridge\Twig\Extension\SecurityExtension']->isGranted("ROLE_USER")) {
// line 10
echo " ";
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new Twig_Error_Runtime('Variable "app" does not exist.', 10, $this->source); })()), "user", array()), "username", array()), "html", null, true);
echo "
";
} else {
// line 12
echo " ";
echo twig_escape_filter($this->env, $this->extensions['Symfony\Bridge\Twig\Extension\TranslationExtension']->trans("LoginWidgetElement.login"), "html", null, true);
echo "
";
}
// line 14
echo " </small>
所以有一个isGranted('ROLE_USER') 检查。现在,在我的渲染方法中:
$response = new Response();
$response->headers->set('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0');
$response->headers->set('Pragma', 'no-cache');
$body = $this->twig->render('@LoginWidgetElement/login_widget.html.twig');
$response->setContent($body);
return $response;
但是仍然没有雪茄:'-(
【问题讨论】:
-
感谢 fucethebads,但该方法已被弃用并删除;-(