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

Sequentially

Это ограничение позволяет вам применять набор правил, которые должны быть валидированы пошагово, позволяя прерывание валидации, как только будет обнаружено первое нарушение.

В качестве альтернативы в ситуациях, которые не может решить Sequentially, вы можете рассмотреть использование GroupSequence, которое позволяет больше контроля.

New in version 5.1: Ограничение Sequentially было представлено в Symfony 5.1.

Базовое использование

Представьте, что у вас есть объект Place со свойством $address, которое должно соответствовать следующим требованиям:

  • не быть пустой строкой
  • состоять как минимум из 10 знаков
  • иметь конкретный формат
  • быть геолокализируемым с помощью внешнего сервиса

В таких ситуациях вы можете столкнуться с тремя проблемами:

  • ограничения Length или Regex могут быть совсем неуспешными с исключением UnexpectedValueException, если реальное значение не является строкой, как требуется Type.
  • вы можете получить множество сообщений ошибок для одного свойства.
  • вы можете сделать бесполезный и сложный внешний вызов для геолокализации адресс, а формат не будет валиден.

Вы можете валидировать каждое из этих ограничений последовательно, чтобы решить эти проблемы:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // src/Localization/Place.php
    namespace App\Localization;
    
    use App\Validator\Constraints as AcmeAssert;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Place
    {
        /**
         * @var string
         *
         * @Assert\Sequentially({
         *     @Assert\NotNull(),
         *     @Assert\Type("string"),
         *     @Assert\Length(min=10),
         *     @Assert\Regex(Place::ADDRESS_REGEX),
         *     @AcmeAssert\Geolocalizable(),
         * })
         */
        public $address;
    }
    
  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    # config/validator/validation.yaml
    App\Localization\Place:
        properties:
            address:
                - Sequentially:
                    - NotNull: ~
                    - Type: string
                    - Length: { min: 10 }
                    - Regex: !php/const App\Localization\Place::ADDRESS_REGEX
                    - App\Validator\Constraints\Geolocalizable: ~
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!-- config/validator/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 https://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
    
        <class name="App\Localization\Place">
            <property name="address">
                <constraint name="Sequentially">
                        <constraint name="NotNull"/>
                        <constraint name="Type">string</constraint>
                        <constraint name="Length">
                            <option name="min">10</option>
                        </constraint>
                        <constraint name="Regex">
                            <option name="pattern">/address-regex/</option>
                        </constraint>
                        <constraint name="App\Validator\Constraints\Geolocalizable"/>
                </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
    // src/Localization/Place.php
    namespace App\Localization;
    
    use App\Validator\Constraints as AcmeAssert;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    
    class Place
    {
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('address', new Assert\Sequentially([
                new Assert\NotNull(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 10]),
                new Assert\Regex(self::ADDRESS_REGEX),
                new AcmeAssert\Geolocalizable(),
            ]));
        }
    }
    

Опции

constraints

тип: array [опция по умолчанию]

Эта обязательная опция является массивом ограничений валидации, которые вы хотите применять последовательно.

groups

type: array | string

It defines the validation group or groups this constraint belongs to. Read more about validation groups.

payload

type: mixed default: null

This option can be used to attach arbitrary domain-specific data to a constraint. The configured payload is not used by the Validator component, but its processing is completely up to you.

For example, you may want to use several error levels to present failed constraints differently in the front-end depending on the severity of the error.

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