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

Compound

В отличие от других ограничений, это ограничение не может быть использовано само по себе. Вместо этого, оно позволяет вам создать собственный набор повторно используемых ограничений, представляющих собой правила для постоянного использования в вашем приложении, расширяя ограничение.

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

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

Представьте, что у вас есть разные места, где должен валидироваться пароль пользователя, вы можете создать соственный именованный набор требований, чтобы он постоянно использовался везде:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // src/Validator/Constraints/PasswordRequirements.php
    namespace App\Validator\Constraints;
    
    use Symfony\Component\Validator\Constraints\Compound;
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * @Annotation
     */
    class PasswordRequirements extends Compound
    {
        protected function getConstraints(array $options): array
        {
            return [
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 12]),
                new Assert\NotCompromisedPassword(),
            ];
        }
    }
    
  • Attributes
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // src/Validator/Constraints/PasswordRequirements.php
    namespace App\Validator\Constraints;
    
    use Symfony\Component\Validator\Constraints\Compound;
    use Symfony\Component\Validator\Constraints as Assert;
    
    #[\Attribute]
    class PasswordRequirements extends Compound
    {
        protected function getConstraints(array $options): array
        {
            return [
                new Assert\NotBlank(),
                new Assert\Type('string'),
                new Assert\Length(['min' => 12]),
                new Assert\NotCompromisedPassword(),
            ];
        }
    }
    

Добавьте @Annotation или #[\Attribute] к классу ограничения, если вы хотите использовать его в качестве аннотации/атрибута в других классах. Если ограничение имеет опции конфигурации, определите их в качестве публичных свойств в классе ограничения.

New in version 5.2: Возможность использовать PHP-атрибуты для конфигурации ограничений была представлена в Symfony 5.2. До этого, аннотации Doctrine были единственным способом аннотации ограничений.

Теперь вы можете использовать его везде, где вам нужно:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // src/Entity/User.php
    namespace App\Entity\User;
    
    use App\Validator\Constraints as Assert;
    
    class User
    {
        /**
         * @Assert\PasswordRequirements()
         */
        public $plainPassword;
    }
    
  • Attributes
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // src/Entity/User.php
    namespace App\Entity\User;
    
    use App\Validator\Constraints as Assert;
    
    class User
    {
        #[Assert\PasswordRequirements]
        public $plainPassword;
    }
    
  • YAML
    1
    2
    3
    4
    5
    # config/validator/validation.yaml
    App\Entity\User:
        properties:
            plainPassword:
                - App\Validator\Constraints\PasswordRequirements: ~
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- 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\Entity\User">
            <property name="plainPassword">
                <constraint name="App\Validator\Constraints\PasswordRequirements"/>
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    // src/Entity/User.php
    namespace App\Entity\User;
    
    use App\Validator\Constraints as Assert;
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    
    class User
    {
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('plainPassword', new Assert\PasswordRequirements());
        }
    }
    

Опции

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.