Метод isMainRequest класса RequestEvent
Метод isMainRequest класса RequestEvent возвращает true, если событие ядра относится к основному запросу, и false, если запрос вложенный. Основным считается запрос, который пришёл от клиента и был обработан ядром Symfony. Вложенные запросы возникают, когда внутри контроллера выполняется дополнительный запрос через HttpKernelInterface::handle с параметром $catch и флагом HttpKernelInterface::SUB_REQUEST. Параметров метод не принимает.
Синтаксис
public function isMainRequest(): bool
Пример
Давайте создадим слушателя события kernel.request, который выводит в лог тип текущего запроса:
<?php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Psr\Log\LoggerInterface;
class RequestListener
{
private LoggerInterface $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onKernelRequest(RequestEvent $event): void
{
if ($event->isMainRequest()) {
$this->logger->info('main request');
} else {
$this->logger->info('sub request');
}
}
}
?>
Регистрируем слушателя в конфигурации сервисов:
services:
App\EventListener\RequestListener:
tags:
- { name: kernel.event_listener, event: kernel.request }
Результат выполнения кода для основного запроса:
"main request"
Пример
Давайте выполним вложенный запрос внутри контроллера и проверим, как отработает метод isMainRequest:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(HttpKernelInterface $kernel): Response
{
$subRequest = Request::create('/article/inner');
$response = $kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
return new Response('outer: ' . $response->getContent());
}
#[Route('/article/inner', name: 'article_inner')]
public function inner(): Response
{
return new Response('inner');
}
}
?>
Результат выполнения кода для адреса /article:
"outer: inner"
При этом слушатель из первого примера для внешнего запроса выведет "main request", а для вложенного - "sub request".
Смотрите также
-
класс
RequestEvent,
который представляет событие ядра с запросом -
метод
getRequest,
который возвращает объект запроса из события -
метод
setResponse,
который устанавливает ответ в событии -
событие
RequestEvent,
которое срабатывает при обработке запроса