Новое в Symfony 7.2: Week, WordCount и Yaml ограничения
Это первая статья из цикла рассказывающего о наиболее важных нововведениях в Symfony 7.2, релиз которой состоится в конце ноября 2024 года.
- Pull Request: [Validator] Add
Yaml
constraint for validating YAML content #53749 Alexandre Daubois - Pull Request: [Validator] Add the
WordCount
constraint #57716 Alexandre Daubois - Pull Request: [Validator] Add
Week
constraint #57908 Alexandre Daubois
Ограничение Week
Это ограничение проверяет, что заданная строка (или объект, реализующий PHP интерфейс Stringable
) представляет собой действительный номер недели в соответствии со стандартом ISO-8601 (например, 2025-W01
). Этот же формат используется в HTML поле ввода недели:
// src/Entity/Rental.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Rental
{
#[Assert\Week]
protected string $bookingWeek;
}
Это ограничение включает опции max
и min
, позволяющие дополнительно ограничить количество недель, выбираемых пользователем:
// src/Entity/OnlineCourse.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class OnlineCourse
{
#[Assert\Week(min: '2022-W01', max: '2022-W20')]
protected string $startWeek;
}
Проверка того, является ли неделя валидной или нет, не так тривиальна, как кажется, потому что некоторые годы имеют 53 недели вместо обычных 52 недель. Благодаря этому новому ограничению можно забыть об этих деталях и позволить Symfony управлять логикой валидации.
Ограничение WordCount
Это ограничение проверяет, что строка (или объект, реализующий PHP-интерфейс Stringable
) содержит количество слов, попадающее в заданный диапазон min-max:
// src/Entity/BlogPostDTO.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class BlogPostDTO
{
#[Assert\WordCount(min: 100, max: 200)]
protected string $content;
}
Подсчёт слов — сложная задача. Поэтому это ограничение опирается на класс IntlBreakIterator из PHP. Он также сильно зависит от языка содержимого, поэтому можно использовать опцию locale
для определения локали содержимого (по умолчанию используется та же локаль, что и в текущем приложении).
Ограничение Yaml
Несмотря на свои причуды, YAML остаётся чрезвычайно популярным языком конфигурирования. Поэтому мы добавили ограничение, которое проверяет, содержит ли заданная строка (или объект Stringable
) валидный синтаксис YAML:
// src/Entity/Report.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Report
{
#[Assert\Yaml(message: "Your configuration doesn't have valid YAML syntax.")]
private string $customConfiguration;
}
Также можно использовать любой из флагов конфигурации, определённых в Symfony компоненте Yaml:
#[Assert\Yaml(
message: "Your configuration doesn't have valid YAML syntax.",
flags: Yaml::PARSE_CONSTANT | Yaml::PARSE_CUSTOM_TAGS | Yaml::PARSE_DATETIME,
)]
private string $customConfiguration;