Як обробляти різні рівні помилок

Дата оновлення перекладу 2022-12-23

Як обробляти різні рівні помилок

Іноді вам може захотітися відобразити повідомлення про помилки обмежень валідації по-різному, засновуючись на деяких правилах. Наприклад, у вас є форма рєстрації для нових користувачів, де вони вводять деяку особисту інформацію та обирають свої атестати аутентифікації. Їм потрібно буде обрати імʼя користувача та безпечний пароль, але надваання інформації про банківський рахунок буде не обовʼязковим. Незважаючи на це, ви хочете переконатися, що ці необовʼязкові поля, якщо будуть заповнені, будуть валідні, але щоб помилки у них відбражалися по-іншому.

Процес досягнення такої поведінки складається з двох кроків:

  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 = $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

Щоб дізнатися більше про налаштування відображення форми, див. Як налаштувати відображення форми.