Как справляться с разными уровнями ошибок

Дата обновления перевода 2023-01-09

Как справляться с разными уровнями ошибок

Иногда, вам может захотеться отобразить сообщения об ошибках ограничений валидации по-разному, основываясь на некоторых правилах. Например, у вас есть форма регистрации для новых пользователей, где они вводят некоторую личную информацию и выбирают свои аттестаты аутнетификации. Им нужно будет выбрать имя пользователя и безопасный пароль, но предоставление информации о банковском счёте будет необязательной. Несмотря на это, вы хотите убедиться, что эти необзяательные поля, если будут заполнены, будут валидны, но чтобы ошибки в них отображались по-другому.

Процесс достижения такого поведения состоит из двух шагов:

  1. Примените разные уровни ошибок к ограничениям валидации;
  2. Персонализируйте ваши сообщения об ошибках, в зависимости от уровня сконфигурированной ошибки.

1. Назначение уровня ошибки

Используйте опцию payload, чтобы сконфигурировать уровень ошибки для каждого ограничения:

  • Attributes
  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// src/Entity/User.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class User
{
    #[Assert\NotBlank(payload: ['severity' => 'error'])]
    protected $username;

    #[Assert\NotBlank(payload: ['severity' => 'error'])]
    protected $password;

    #[Assert\Iban(payload: ['severity' => 'warning'])]
    protected $bankAccountNumber;
}

2. Персонализация шаблона сообщения об ошибке

Когда валидация объекта User будет неуспешной, вы можете вернуть ограничение, которое вызвало определённую ошибку, используя метод getConstraint(). Каждое ограничение показывает прикрепленную полезную нагрузку, как публичное свойство:

1
2
3
4
5
// неудача валидации ограничения, экземпляр
// Symfony\Component\Validator\ConstraintViolation
$constraintViolation = ...;
$constraint = $constraintViolation->getConstraint();
$severity = isset($constraint->payload['severity']) ? $constraint->payload['severity'] : null;

Например, вы можете использовать это, чтобы настроить блок form_errors так, чтобы значимость была добавлена как дополнительный HTML-класс:

1
2
3
4
5
6
7
8
9
{%- block form_errors -%}
    {%- if errors|length > 0 -%}
    <ul>
        {%- for error in errors -%}
            <li class="{{ error.cause.constraint.payload.severity ?? '' }}">{{ error.message }}</li>
        {%- endfor -%}
    </ul>
    {%- endif -%}
{%- endblock form_errors -%}

See also

Чтобы узнать больше информациюю о настройке отображения форм, см. Как настроить отображение формы.