Новое в Symfony 5.1: Улучшения маршрутизации

Symfony 5.1 добавляет важные новые функции, связанные с маршрутизацией, такие как приоритет для аннотаций маршрутов и более простая конфигурация маршрутов. В этой статье покажут другие незначительные, но интересные функции, добавленные в маршрутизацию.

Добавлен атрибут маршрута без состояния

Маршруты теперь могут настраивать логическую опцию stateless. Если установлено значение true, они объявляют, что сессии не будет использоваться во время обработки запроса.

Если маршрут без состояния будет использовать сесси, вы увидите исключение, когда отладка включена в приложении, и получите сообщение журнала, когда отладка отключена:

// src/Controller/MainController.php
namespace App\Controller;

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

class MainController extends AbstractController
{
    /**
     * @Route("/", name="homepage", stateless=true)
     */
    public function homepage()
    {
        // ...
    }
}

Разрешить использование env vars в условиях маршрута

Условия маршрутизации определяют выражения, которым должны соответствовать маршруты. В Symfony 5.1 улучшили эти выражения, чтобы разрешить использование переменных среды.

При использовании env vars вы также можете применять любой из процессоров Symfony env var:

/**
 * @Route("/new-feature", condition="env('bool:IS_FEATURE_ENABLED') === true")
 */
public function __invoke()
{
    // this route will only execute when the value of the
    // IS_FEATURE_ENABLED env var is TRUE
}

Более простая конфигурация RequestContext

Создание URL-адресов в консольных командах и в любом другом месте вне веб-контекста является сложной задачей, поскольку Symfony не имеет доступа к текущему хосту, базовому URL-адресу и т. д.

В этих случаях вам необходимо настроить контекст запроса, используя параметры контейнера, такие как router.request_context.host. В Symfony 5.1 вы можете настроить эти значения с помощью параметра framework.router:

# config/packages/routing.yaml
framework:
    router:
        # ...
        host: 'example.org'
        scheme: 'https'
        base_url: 'my/path'