Новое в Symfony 5.4: Различные улучшения (часть 3)

Источник: «New in Symfony 5.4: Misc. features (part 3)»
Улучшения в Symfony 5.4: более длинные интервалы для компонента RateLimiter; простой способ создания ошибок в компоненте Validator; блокировка файлов при добавлении данных в методе Filesystem; экстрактор метаданных PhpStan для компонента PropertyInfo

Это последний пост из серии в которой мы рассказывали о новых возможностях Symfony 5.4 и Symfony 6. Мы надеемся, что вам понравилось и вы захотите обновить свои приложения Symfony до этих версий.

Более Длинные Интервалы RateLimiter

Компонент RateLimiter представляет реализацию Token Bucket для ограничения ввода и вывода вашего приложения. Обычно используется в таких функциях, как ограничение попыток входа (например, разрешает 5 неудачных попыток входа в систему каждый час) и ограничения API (например, до 1000 запросов в час).

Однако, некоторым приложениям требуются более длительные интервалы, что бы разрешить определённое количество событий в месяц или даже год. Вот почему в Symfony 5.4 мы добавили методы perMonth() и perYear() в компонент RateLimiter.

Простой Способ Создания Ошибок Ограничения

При использовании компонента Validator, если какая-то проверка не удалась вы получите список ошибок в виде класса ConstraintViolationList. Вам нужно сделать то же самое при создании ошибки валидации самостоятельно. Это обременительно, если у вас всего одна ошибка:

$violations = new ConstraintViolationList();
$violations->add(new ConstraintViolation('A publish is already running.', '', [], null, '', null));

// например, когда используется ApiPlatform\Core\Bridge\Symfony\Validator\Exception\ValidationException
throw new ValidationException($violations);

В Symfony 5.4 мы добавили новый метод createSingleConstraint(), чтобы упростить создание одиночных ошибок валидации:

$violations = ConstraintViolationList::createSingleConstraint('A publish is already running.');

throw new ValidationException($violations);

Блокировка Файлов при Добавлении Данных к Ним

Компонент Filesystem предоставляет независимые от операционной системы возможности, связанные с файловой системой. Одна из таких утилит - метод appendToFile(), который добавляет контент в конец файла.

В Symfony 5.4 мы его улучшили с помощью третьего, необязательно логического аргумента. Если установлено значение true, Symfony получит эксклюзивную блокировку файла пока идёт запись (аналогично флагу \LOCK_EX в PHP).

$filesystem->appendToFile('logs.txt', 'Email sent to user@example.com');

// третий аргумент сообщает, следует ли блокировать файл при записи в него
$filesystem->appendToFile('logs.txt', 'Email sent to user@example.com', true);

PhpStan Экстрактор для PropertyInfo

Компонент PropertyInfo извлекает информацию о свойствах классов PHP используя метаданные популярных источников (Doctrine, PHP Reflection, PHPdoc, и т.д.) В Symfony 5.4 мы добавили поддержку извлечения информации на основе метаданных заданных для PHPStan, популярного инструмента для статического анализа PHP.

Это позволит вам извлекать информацию из таких метаданных:

class SomeClass
{
/** @var string|int */
public $property1;

/** @var (string|int)[] */
public $property2;

/** @var array<string|int> */
public $property3;

/** @var array<string|int, array<string>> */
public $property4;

/** @var (Dummy<array<mixed, string>, (int | (string<DefaultValue>)[])> | ParentDummy | null) */
public $property5;
}

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

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

Новое в Symfony 5.4: Различные улучшения (часть 2)

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

CSS: Современные селекторы псевдоклассов