Новое в Symfony 5.2: Ограничения как атрибуты PHP

PHP 8 будет выпущен через несколько недель и будет включать функцию изменения правил игры, называемую атрибутами (или аннотациями). В Symfony 5.2 добавили поддержку определения маршрутов как атрибутов и аргументов контроллера как атрибутов.

Ограничения казались следующим очевидным шагом, поэтому в Symfony 5.2 вы можете определять ограничения проверки как атрибуты PHP. Переход был разработан таким образом, чтобы он был плавным:

Раньше, используя аннотации через комментарии PHP и библиотеку аннотаций Doctrine:

// src/Entity/Author.php
namespace App\Entity;

// ...
use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    /**
     * @Assert\Choice(
     *     choices = { "fiction", "non-fiction" },
     *     message = "Choose a valid genre."
     * )
     */
    private $genre;

    // ...
}

После, используя собственные атрибуты PHP 8:

// src/Entity/Author.php
namespace App\Entity;

// ...
use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    #[Assert\Choice(
        choices: ['fiction', 'non-fiction'],
        message: 'Choose a valid genre.',
    )]
    private $genre;

    // ...
}

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

  • All
  • AtLeastOneOf
  • Collection
  • Compound (abstract)
  • Existence (abstract)
    • Required
    • Optional
  • Sequentially

Причина в том, что им потребуются вложенные атрибуты, а PHP пока не поддерживает эту функцию. Мы все еще обсуждаем, как лучше всего решить эту проблему. Попробуйте присоединиться к обсуждению вопроса №38503.