Choice

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

Применяется к свойству или методу
Опции
Класс Choice
Валидатор ChoiceValidator

Базовое применение

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

Если список ваших валидных вариантов прост, то вы можетеп передать их напрямую через опцию choices:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    // src/AppBundle/Entity/Author.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        /**
         * @Assert\Choice({"New York", "Berlin", "Tokyo"})
         */
        protected $city;
    
        /**
         * @Assert\Choice(choices = {"fiction", "non-fiction"}, message = "Choose a valid genre.")
         */
        protected $genre;
    }
    
  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # src/AppBundle/Resources/config/validation.yml
    AppBundle\Entity\Author:
        properties:
            city:
                - Choice: [New York, Berlin, Tokyo]
            genre:
                - Choice:
                    choices:  [fiction, non-fiction]
                    message:  Choose a valid genre.
    
  • 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
    <!-- 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\Author">
            <property name="city">
                <constraint name="Choice">
                    <value>New York</value>
                    <value>Berlin</value>
                    <value>Tokyo</value>
                </constraint>
            </property>
            <property name="genre">
                <constraint name="Choice">
                    <option name="choices">
                        <value>fiction</value>
                        <value>non-fiction</value>
                    </option>
                    <option name="message">Choose a valid genre.</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
    22
    23
    // src/AppBundle/EntityAuthor.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        protected $genre;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint(
                'city',
                 new Assert\Choice(array('New York', 'Berlin', 'Tokyo'))
             );
    
            $metadata->addPropertyConstraint('genre', new Assert\Choice(array(
                'choices' => array('fiction', 'non-fiction'),
                'message' => 'Choose a valid genre.',
            )));
        }
    }
    

Поставка вариантов с функцией обратного вызова

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// src/AppBundle/Entity/Author.php
namespace AppBundle\Entity;

class Author
{
    public static function getGenres()
    {
        return array('fiction', 'non-fiction');
    }
}

New in version 3.2: Начиная с Symfony 3.2, обратный вызов больше не должен быть статичным.

Вы можете передать имя этого метода опции callback ограничения Choice.

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // src/AppBundle/Entity/Author.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        /**
         * @Assert\Choice(callback = "getGenres")
         */
        protected $genre;
    }
    
  • YAML
    1
    2
    3
    4
    5
    # src/AppBundle/Resources/config/validation.yml
    AppBundle\Entity\Author:
        properties:
            genre:
                - Choice: { callback: getGenres }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- 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\Author">
            <property name="genre">
                <constraint name="Choice">
                    <option name="callback">getGenres</option>
                </constraint>
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    // src/AppBundle/EntityAuthor.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        protected $genre;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('genre', new Assert\Choice(array(
                'callback' => 'getGenres',
            )));
        }
    }
    

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

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // src/AppBundle/Entity/Author.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        /**
         * @Assert\Choice(callback = {"Util", "getGenres"})
         */
        protected $genre;
    }
    
  • YAML
    1
    2
    3
    4
    5
    # src/AppBundle/Resources/config/validation.yml
    AppBundle\Entity\Author:
        properties:
            genre:
                - Choice: { callback: [Util, getGenres] }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- 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\Author">
            <property name="genre">
                <constraint name="Choice">
                    <option name="callback">
                        <value>Util</value>
                        <value>getGenres</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
    // src/AppBundle/Entity/Author.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        protected $genre;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('genre', new Assert\Choice(array(
                'callback' => array('Util', 'getGenres'),
            )));
        }
    }
    

Доступные опции

choices

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

Обязательная опция (кроме случаев, когда указана callback) - это массив опций, которые должны быть рассмотрены в валидном наборе. Значение ввода будет сопоставлено с тим массивом.

callback

тип: string|array|Closure

Это метод обратного вызова, который может быть использован вместо опции choices, чтобы вернуть массив опций. См. Поставка вариантов с функцией обратного вызова, чтобы узнать детали его использования.

multiple

тип: boolean по умолчанию: false

Если эта опция установлена, как "true", то значение ввода должно быть массивом вместо одиночного скалярного значения. Ограничение проверит, чтобы каждое значение массива ввода можно было найти в массиве валидных вариантов. Даже если одно из значений ввода нельзя найти, то валидация будет неудачной.

min

тип: integer

Если опция multiple - "true", то вы можете использовать опцию min, чтобы формировать минимальное количество значений для выбора. Например, если min - 3, а массив ввода содержит только два валидных элемента, то валидация будет неудачной.

max

тип: integer

Если опция multiple - "true", то вы можете использовать опцию max, чтобы формировать макисмальное количество значений для выбора. Например, если max - 3, а массив ввода содержит 4 валидных элемента, то валидация будет неудачной.

message

тип: string по умолчанию: Значение, которое вы выбрали, не является валидным вариантом.

Это сообщение, которое вы получите, если опция multiple установлена, как false и основоположное значение не находится в массиве валидных вариантов.

multipleMessage

тип: string по умолчанию: Одно или более значений инвалидны.

Это сообщение, которое вы получите, если опция multiple установлена, как true и одно из значение проверяемого основоположного массива не находится в массиве валидных вариантов.

minMessage

тип: string по умолчанию: Вы должны выбрать хотя бы {{ limit }} вариантов.

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

maxMessage

тип: string по умолчанию: Вы должны выбрать не больше {{ limit }} вариантов.

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

strict

тип: boolean по умолчанию: false

Валидатор также проверит тип значения ввода. А именно, это значение передаётся в качестве третьего аргумента PHP-метода in_array при проверке того, находится ли значение в массиве валидных значений.

Caution

Установка строгой опции Ограничения выбора, как false устарела, начиная с Symfony 3.2, и опция будет изменена на true в версии 4.0.

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.