Визуализировать один шаблон Twig без кеша

В нашем проекте 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 запросов, прежде чем переменная изменится !! ??

Кеш Twig:

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

Однако сигары по-прежнему нет: '- (

stackoverflow.com/questions/14234464/…
fucethebads 05.09.2018 11:54

спасибо fucethebads, но этот метод устарел и удален ;-(

delboy1978uk 05.09.2018 12:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
947
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, установка заголовков кеша имеет собственный метод, и мы не должны просто использовать $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;
}

Другие вопросы по теме