Новое в 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);
// ...
}
}