Новое в Symfony 6.4: Маршруты на основе FQCN
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
{
// ...
}
}
Эта возможность совершенно необязательна, поэтому вы можете продолжать использовать и определять маршруты так же, как и раньше. Однако это позволит разработчикам, использующим вызываемые контроллеры и контроллеры с одним маршрутом, избежать использования "магических строк" для определения имён маршрутов.