For the complete documentation index, see llms.txt. This page is also available as Markdown.

Свои правила валидации

Модуль может добавить собственное правило, не изменяя ядро. Способ зависит от того, что именно вы проверяете.

Обёртка над готовым правилом 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/ модуля, который подключён к контейнеру.

Правило с собственной проверкой

Когда проверка своя — обращение к базе, сессии, сведениям о посетителе, — обёртка ничего не даёт. В этом случае правило само является констрейнтом:

Сама проверка живёт в классе-валидаторе. Зависимости он получает через конструктор — это обычный сервис контейнера:

Значения в тексте сообщения

Если сообщение содержит подстановку, заполните её при создании нарушения:

Переводы сообщений

Текст сообщения должен попасть в файлы переводов, а туда его собирает сканер composer translate-scan. Он видит только литеральные вызовы функций перевода, поэтому:

Плейсхолдеры пишутся в формате %имя%. После добавления сообщения выполните composer translate-scan, затем composer translate — подробности в разделе «Многоязычность».

Доступ к другим полям формы

Валидатор проверяет весь массив данных сразу, поэтому в своём валидаторе можно получить и остальные поля:

Это пригодится для правил, сравнивающих поля между собой, — например «пароль и его подтверждение совпадают».

Последнее обновление

Это было полезно?