Метод push класса RequestStack
Метод push класса RequestStack добавляет
объект Request в вершину стека запросов.
Первым параметром передаётся объект запроса, который
нужно поместить в стек. После вызова метода этот
запрос становится текущим и доступен через метод
getCurrentRequest. Метод ничего не возвращает.
Класс RequestStack хранит все запросы,
обрабатываемые в течение жизненного цикла приложения.
Когда Symfony обрабатывает вложенный запрос (например,
через HttpKernel::handle внутри контроллера),
новый запрос помещается в стек методом push,
а после обработки извлекается методом pop.
Синтаксис
$requestStack->push($request);
Пример
Давайте создадим стек запросов и добавим в него
новый объект Request:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RequestStack $requestStack): Response
{
$request = Request::create('/user');
$requestStack->push($request);
$current = $requestStack->getCurrentRequest();
return new Response($current->getPathInfo());
}
}
?>
Результат выполнения кода для адреса /article:
"/user"
Пример
Давайте добавим два запроса в стек и проверим, какой из них является текущим:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RequestStack $requestStack): Response
{
$first = Request::create('/hello');
$second = Request::create('/abcde');
$requestStack->push($first);
$requestStack->push($second);
$current = $requestStack->getCurrentRequest();
return new Response($current->getPathInfo());
}
}
?>
Результат выполнения кода для адреса /article:
"/abcde"
Пример
Давайте используем метод push для подмены
текущего запроса внутри контроллера:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RequestStack $requestStack): Response
{
$custom = Request::create('/user?name=abcde');
$requestStack->push($custom);
$current = $requestStack->getCurrentRequest();
$name = $current->query->get('name');
return new Response($name);
}
}
?>
Результат выполнения кода для адреса /article:
"abcde"
Смотрите также
-
класс
RequestStack,
который хранит стек запросов -
метод
getCurrentRequest,
который возвращает текущий запрос -
метод
getMainRequest,
который возвращает главный запрос -
метод
pop,
который извлекает запрос из вершины стека