Новое в Symfony 6.3 — Улучшения Перечислений

Источник: «New in Symfony 6.3: Enum Improvements»
В Symfony 6.3 добавлена поддержка перечислений в выражениях, деревьях конфигурации и параметрах маршрута.

Symfony 5.4 представил поддержку Перечислений в формах в ноябре 2021 года. Позже, в Symfony 6.2, мы улучшили поддержку перечислений, чтобы их можно было использовать в файлах YAML, переменных env и т.д. В Symfony 6.3 мы снова улучшаем поддержку перечислений.

Перечисления в выражениях

Компонент ExpressionLanguage теперь включает функцию enum() для получения case перечислений внутри выражений:

namespace App\Config\Order;

enum OrderStatus
{
case Paid = 'paid';
case Pending = 'pending';
case Refunded = 'refunded';
case Deleted = 'deleted';
}

// внутри выражений, разделители namespace должны быть экранированы тремя обратными слэшами
$expressionLanguage->evaluate('order.status == enum("App\\\Config\\\Order\\\OrderStatus::Paid")')

Поддержка перечислений в enumNode Config

Теперь при использовании компонента Config вы можете использовать значения перечисления как часть допустимых значений узлов перечислений, определённых с помощью метода enumNode():

enum OrderDelivery: string
{
case Standard = 'standard';
case Expedited = 'expedited';
case Priority = 'priority';
}

$rootNode
->children()
->enumNode('delivery')
// Вы можете указать все значения перечисления...
->values(OrderDelivery::cases())

// ... или вы можете передать только некоторые значения после других скалярных значений
->values([OrderDelivery::Priority, OrderDelivery::Standard, 'other', false])
->end()
->end()
;

Перечисления как параметры маршрута

В Symfony 6.3 вы можете использовать значения перечислений в качестве аргументов маршрута и позволить Symfony автоматически преобразовать их в соответствующий case перечислений:

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

use App\Config\Order\OrderStatus;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class OrderController extends AbstractController
{
#[Route('/orders/list/{status}', name: 'list_orders_by_status')]
public function list(OrderStatus $status = OrderStatus::Paid): Response
{
// ...
}
}

Входящий запрос, например, /orders/list/deleted приведёт к тому, аргумент контроллера $status будет иметь значение OrderStatus::Deleted.

В связи с этим мы также улучшили пакет параметров, используемый для получения значений из Request добавив метод getEnum(). Это преобразует,например, значения из строки запроса в перечисление:

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

// ...
use Symfony\Component\HttpFoundation\Request;

class OrderController extends AbstractController
{
#[Route('/orders/list/', name: 'list_orders')]
public function list(Request $request): Response
{
// второй аргумент это FQCN перечисления, используемое при преобразовании значения
$status = $request->query->getEnum('status', OrderStatus::class);

// ...
}
}

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

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

PHP: Выполнение более строгих проверок

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

Новое в Symfony 6.3 — Улучшения login и logout