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

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

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

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

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

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

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

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // src/AppBundle/Entity/User.php
    namespace AppBundle\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;
    }
    
  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    # src/AppBundle/Resources/config/validation.yml
    AppBundle\Entity\User:
        properties:
            username:
                - NotBlank:
                    payload:
                        severity: error
            password:
                - NotBlank:
                    payload:
                        severity: error
            bankAccountNumber:
                - Iban:
                    payload:
                        severity: warning
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <!-- src/AppBundle/Resources/config/validation.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
    
        <class name="AppBundle\Entity\User">
            <property name="username">
                <constraint name="NotBlank">
                    <option name="payload">
                        <value key="severity">error</value>
                    </option>
                </constraint>
            </property>
            <property name="password">
                <constraint name="NotBlank">
                    <option name="payload">
                        <value key="severity">error</value>
                    </option>
                </constraint>
            </property>
            <property name="bankAccountNumber">
                <constraint name="Iban">
                    <option name="payload">
                        <value key="severity">warning</value>
                    </option>
                </constraint>
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // src/AppBundle/Entity/User.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class User
    {
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('username', new Assert\NotBlank(array(
                'payload' => array('severity' => 'error'),
            )));
            $metadata->addPropertyConstraint('password', new Assert\NotBlank(array(
                'payload' => array('severity' => 'error'),
            )));
            $metadata->addPropertyConstraint('bankAccountNumber', new Assert\Iban(array(
                'payload' => array('severity' => 'warning'),
            )));
        }
    }
    

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

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

1
2
3
4
5
// a constraint validation failure, instance of
// 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
10
11
12
{%- block form_errors -%}
    {%- if errors|length > 0 -%}
    <ul>
        {%- for error in errors -%}
            {% if error.cause.constraint.payload.severity is defined %}
                {% set severity = error.cause.constraint.payload.severity %}
            {% endif %}
            <li{% if severity is defined %} class="{{ severity }}"{% endif %}>{{ error.message }}</li>
        {%- endfor -%}
    </ul>
    {%- endif -%}
{%- endblock form_errors -%}
Чтобы узнать больше информациюю о настройке оотображения форм, см. How to Customize Form Rendering.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.