Класс Router
Класс Router является центральным компонентом маршрутизации в Symfony.
Он позволяет сопоставить входящий URL с определённым маршрутом и
сгенерировать URL по имени маршрута и параметрам. Основные методы:
match для поиска маршрута по URL и generate для
создания ссылки. Класс реализует интерфейс
RequestContextAwareInterface и использует
RouteCollection для хранения маршрутов.
Синтаксис
use Symfony\Component\Routing\Router;
$router = new Router($loader, $resource, $options);
Параметры конструктора:
$loader- загрузчик маршрутов (например,YamlFileLoader);$resource- путь к файлу с маршрутами;$options- массив опций (кэш, отладка и т.д.).
Пример
Давайте получим сервис router из контейнера и сгенерируем URL по имени маршрута 'article_index':
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RouterInterface $router): Response
{
$url = $router->generate('article_index');
return new Response($url);
}
}
?>
Результат выполнения кода:
"/article"
Пример
Давайте используем метод match для получения информации о маршруте по URL '/user/abcde':
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Routing\RouterInterface;
class UserController extends AbstractController
{
#[Route('/user/{name}', name: 'user_show')]
public function show(string $name): Response
{
return new Response('User: ' . $name);
}
#[Route('/match-test', name: 'match_test')]
public function matchTest(RouterInterface $router): Response
{
$params = $router->match('/user/abcde');
return new Response(json_encode($params));
}
}
?>
Результат выполнения кода для адреса /match-test:
{"_route": "user_show", "name": "abcde"}