Отрисовать один шаблон Twig без кеша - PullRequest
0 голосов
/ 05 сентября 2018

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

Отображается либо «Вход», либо адрес электронной почты пользователя, если он уже вошел в систему.

Проблема в том, что шаблон веточки также кэшируется! Так что загрузка через 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();
    }
}

UPDATE

Шаблон ветки, кажется, проверяет, поэтому я попытался отправить ответ, говорящий браузеру не кэшировать, но все еще требуется около 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;

Тем не менее сигара, однако: '- (

1 Ответ

0 голосов
/ 05 сентября 2018

Похоже, установка заголовков кэша имеет свой собственный метод, и мы не должны просто использовать $response->headers->set($key, $val);

Я переместил логику в черту многократного использования:

<?php

namespace Xyz\Library\Traits;

use Symfony\Component\HttpFoundation\Response;

trait NoCacheHeadersTrait
{
    public function disableBrowserCache(Response $response) : Response
    {
        $response->headers->addCacheControlDirective('no-store', true);
        $response->headers->addCacheControlDirective('no-cache', true);
        $response->headers->addCacheControlDirective('must-revalidate', true);
        $response->headers->addCacheControlDirective('max-age', 0);
        $response->headers->addCacheControlDirective('post-check', 0);
        $response->headers->addCacheControlDirective('pre-check', 0);
        $response->headers->set('Pragma', 'no-cache');

        return $response;
    }
}

А теперь я use черта в классе, и в моем методе рендеринга это теперь выглядит так:

public function render()
{
    $response = $this->disableBrowserCache(new Response());
    $body = $this->twig->render('@LoginWidgetElement/login_widget.html.twig');
    $response->setContent($body);

    return $response;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...