Метод forward класса AbstractController
Метод forward класса AbstractController
перенаправляет запрос на другой контроллер,
не изменяя адрес в браузере пользователя.
Первым параметром передаётся имя контроллера
в формате 'App\Controller\ArticleController::index',
вторым - массив аргументов, которые будут
переданы в целевой метод.
В отличие от redirectToRoute, метод forward
не создаёт новый HTTP-запрос, а вызывает
другой контроллер внутри текущего запроса.
Синтаксис
$this->forward(string $controller, array $path = [])
Пример
Давайте перенаправим запрос из метода index
в метод show того же контроллера:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(): Response
{
return $this->forward('App\Controller\ArticleController::show');
}
public function show(): Response
{
return new Response('hello');
}
}
?>
Результат выполнения кода:
hello
Пример
Давайте передадим аргументы в целевой контроллер:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/user/{name}', name: 'article_user')]
public function index(string $name): Response
{
return $this->forward(
'App\Controller\ArticleController::show',
['name' => $name]
);
}
public function show(string $name): Response
{
return new Response($name);
}
}
?>
Результат выполнения кода для адреса /user/abcde:
abcde
Пример
Давайте перенаправим запрос в контроллер другого класса:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class MainController extends AbstractController
{
#[Route('/main', name: 'main_index')]
public function index(): Response
{
return $this->forward(
'App\Controller\ArticleController::show',
['text' => 'article']
);
}
}
?>
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function show(string $text): Response
{
return new Response($text);
}
}
?>
Результат выполнения кода для адреса /main:
article
Пример
Давайте используем метод forward вместе
с методом render для вывода шаблона:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
return $this->forward('App\Controller\ArticleController::show');
}
public function show(): Response
{
return $this->render('article/show.html.twig', [
'title' => 'article',
]);
}
}
?>
<h1>{{ title }}</h1>
Результат выполнения кода для адреса /article:
<h1>article</h1>
Смотрите также
-
класс
AbstractController,
который предоставляет базовые методы контроллера -
метод
render,
который возвращает отрендеренный Twig-шаблон -
метод
redirectToRoute,
который выполняет редирект на маршрут -
метод
generateUrl,
который генерирует URL по имени маршрута