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.