Свои правила валидации
Модуль может добавить собственное правило, не изменяя ядро. Способ зависит от того, что именно вы проверяете.
Обёртка над готовым правилом Symfony
Если проверка уже реализована в symfony/validator (например Regex, Ip, Url), напишите два класса: объект-правило и фабрику, которая превращает его в констрейнт.
Объект-правило описывает, что настраивает разработчик формы. Он не знает о движке валидации:
<?php
declare(strict_types=1);
namespace Johncms\Modules\MyModule\Application\Validation;
use Johncms\Validator\Rules\RequiresValueInterface;
final readonly class PhoneNumber implements RequiresValueInterface
{
public function __construct(
private bool $allowEmpty = false,
private ?string $message = null,
) {
}
public function allowEmpty(): bool
{
return $this->allowEmpty;
}
public function message(): ?string
{
return $this->message;
}
}Реализуйте RequiresValueInterface, если пустое значение должно считаться ошибкой (перед правилом будет добавлена проверка на заполненность). Если правило допускает пустое значение всегда — реализуйте RuleInterface с одним методом message().
Фабрика собирает констрейнт:
Фабрика может вернуть и список констрейнтов, если одно правило проверяет несколько условий.
Регистрация не нужна: фабрики находятся по интерфейсу автоматически. Достаточно, чтобы классы лежали в src/ модуля, который подключён к контейнеру.
Правило с собственной проверкой
Когда проверка своя — обращение к базе, сессии, сведениям о посетителе, — обёртка ничего не даёт. В этом случае правило само является констрейнтом:
Сама проверка живёт в классе-валидаторе. Зависимости он получает через конструктор — это обычный сервис контейнера:
Не обращайтесь к контейнеру внутри валидатора через di(...). Зависимости передаются конструктором: так правило можно протестировать, не поднимая приложение целиком.
Значения в тексте сообщения
Если сообщение содержит подстановку, заполните её при создании нарушения:
Переводы сообщений
Текст сообщения должен попасть в файлы переводов, а туда его собирает сканер composer translate-scan. Он видит только литеральные вызовы функций перевода, поэтому:
Плейсхолдеры пишутся в формате %имя%. После добавления сообщения выполните composer translate-scan, затем composer translate — подробности в разделе «Многоязычность».
Доступ к другим полям формы
Валидатор проверяет весь массив данных сразу, поэтому в своём валидаторе можно получить и остальные поля:
Это пригодится для правил, сравнивающих поля между собой, — например «пароль и его подтверждение совпадают».
Последнее обновление
Это было полезно?