Новое в Symfony 6.4: Маршруты на основе FQCN

Источник: «New in Symfony 6.4: FQCN-based Routes»
В приложениях Symfony система маршрутизации требует, чтобы каждый маршрут имел имя, которое представляет собой произвольную строку, однозначно идентифицирующую маршрут. В дальнейшем это имя используется, например, при генерации URL-адресов на основе определений маршрутов.

Pull Request: [Routing] Add FQCN and FQCN::method aliases when applicable #50084 Thomas Calvet

Имя маршрута обычно задаётся разработчиками явно при добавлении маршрутов (например, через опцию name атрибута #[Route]):

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

final class BlogController extends AbstractController
{
#[Route('/blog', name: 'blog_index')]
public function index(): Response
{
// ...
}
}

Если имя маршрута не задано явно, Symfony автоматически генерирует имя маршрута на основе пространства имён контроллера и имени метода действия. В приведённом выше примере автоматически созданное имя маршрута будет app_blog_index.

В некоторых приложениях Symfony разработчики используют вызываемые контроллеры, чтобы определить только одно действие на контроллер. Например:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/blog')]
final class BlogController extends AbstractController
{
public function __invoke(): Response
{
// ...
}
}

Учитывая, что контроллер определяет только один маршрут, FQCN (полностью вычисленное имя класса) контроллера может однозначно идентифицировать этот маршрут. Поэтому в Symfony 6.4 мы вводим автоматическое определение имён маршрутов на основе FQCN контроллеров.

На практике в приведённом выше примере будет задан маршрут App\Controller\BlogController, и вы сможете генерировать URL-адреса на основе этого маршрута следующим образом:

use App\Controller\BlogController;
// ...

$url = $this->urlGenerator->generate(BlogController::class);

Помимо вызываемых контроллеров, эта возможность работает и для контроллеров, определяющих только один маршрут. В следующем примере сгенерированное имя маршрута — App\Controller\BlogController::index:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

final class BlogController extends AbstractController
{
#[Route('/blog')]
public function index(): Response
{
// ...
}
}

Эта возможность совершенно необязательна, поэтому вы можете продолжать использовать и определять маршруты так же, как и раньше. Однако это позволит разработчикам, использующим вызываемые контроллеры и контроллеры с одним маршрутом, избежать использования "магических строк" для определения имён маршрутов.

Дополнительные материалы

Предыдущая Статья

Руководство по Soft Delete в Laravel

Следующая Статья

Нюансы base64-кодирования строк в JavaScript