Метод isNotModified
Метод isNotModified класса Response проверяет,
изменялся ли ответ с момента последнего запроса клиента.
Метод принимает объект Request и сравнивает его
заголовки If-Modified-Since и If-None-Match
с заголовками Last-Modified и ETag текущего ответа.
Если ответ не менялся, метод возвращает true,
и клиенту следует отдать статус 304 Not Modified.
Синтаксис
public function isNotModified(Request $request): bool
Пример
Давайте проверим, изменился ли ответ с момента последнего запроса клиента:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(Request $request): Response
{
$response = new Response('article');
$response->setLastModified(new \DateTime('2024-01-01 12:00:00'));
if ($response->isNotModified($request)) {
return $response;
}
return $response;
}
}
?>
Результат выполнения кода при повторном запросе без изменений:
304 Not Modified
Пример
Давайте проверим кэш с помощью заголовка ETag:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/user', name: 'article_user')]
public function user(Request $request): Response
{
$response = new Response('user');
$response->setEtag(md5('user'));
if ($response->isNotModified($request)) {
return $response;
}
return $response;
}
}
?>
Результат выполнения кода при совпадении ETag:
304 Not Modified
Пример
Давайте вернём полный ответ, если данные изменились:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/hello', name: 'article_hello')]
public function hello(Request $request): Response
{
$response = new Response('hello');
$response->setLastModified(new \DateTime('2024-06-01 10:00:00'));
if ($response->isNotModified($request)) {
return $response;
}
$response->setContent('hello world');
return $response;
}
}
?>
Результат выполнения кода при изменении данных:
hello world
Смотрите также
-
класс
Response,
который представляет HTTP-ответ -
метод
setLastModified,
который задаёт дату последнего изменения -
метод
setEtag,
который задаёт ETag ответа -
метод
prepare,
который подготавливает ответ к отправке