UniqueEntity

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

Применяется к классу
Опции
Класс UniqueEntity
Валидатор UniqueEntityValidator

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

Представьте, что у вас есть пакет AppBundle с сущностью User, которая имеет поле email. Вы можете использовать ограничение UniqueEntity, чтобы гарантировать, что поле email остаётся уникальным между всеми ограничениями в вашей таблице пользователей:

  • Annotations
     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/Entity/Author.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    use Doctrine\ORM\Mapping as ORM;
    
    // DON'T forget this use statement!!!
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * @ORM\Entity
     * @UniqueEntity("email")
     */
    class Author
    {
        /**
         * @var string $email
         *
         * @ORM\Column(name="email", type="string", length=255, unique=true)
         * @Assert\Email()
         */
        protected $email;
    
        // ...
    }
    
  • YAML
    1
    2
    3
    4
    5
    6
    7
    # src/AppBundle/Resources/config/validation.yml
    AppBundle\Entity\Author:
        constraints:
            - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: email
        properties:
            email:
                - Email: ~
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- 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">
            <constraint name="Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity">
                <option name="fields">email</option>
            </constraint>
            <property name="email">
                <constraint name="Email" />
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // src/AppBundle/Entity/Author.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    // НЕ забудьте это утверждение использования!!!
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    class Author
    {
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addConstraint(new UniqueEntity(array(
                'fields'  => 'email',
            )));
    
            $metadata->addPropertyConstraint('email', new Assert\Email());
        }
    }
    

Опции

fields

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

Эта обязательная опция является полем (или списком полей), в котором данная сущность должна быть уникальной. Например, если вы указали оба поля email и name в одном ограничении UniqueEntity, то оно будет требовать, чтобы значение комбинации было уникальным (например, два пользователя могут иметь одинаковый электронный адрес, если имена у них разные).

Если вам нужно требовать, чтобы два поля были уникальны индивидуально (например, уникальный email и уникальный username), то вы используете две записи UniqueEntity, каждую с одним полем.

message

тип: string по умолчанию: Это значение уже используется.

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

Сообщения могут включать в себя заполнитель {{ value }}, чтобы отображать строчное представление невалидной записи. Если запись не определяет метод __toString(), то будет использовано следующее общее значение: "Объект класса __CLASS__ идентифицируется <comma separated IDs>"

em

тип: string

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

repositoryMethod

тип: string по умолчанию: findBy()

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

entityClass

New in version 3.2: Опция entityClass была представлена в Symfony 3.2.

тип: string

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

errorPath

тип: string по умолчанию: Имя первого поля в fields

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

Рассмотрите этот пример:

  • Annotations
     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
    // src/AppBundle/Entity/Service.php
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * @ORM\Entity
     * @UniqueEntity(
     *     fields={"host", "port"},
     *     errorPath="port",
     *     message="Этот порт уже используется на данном хосте."
     * )
     */
    class Service
    {
        /**
         * @ORM\ManyToOne(targetEntity="Host")
         */
        public $host;
    
        /**
         * @ORM\Column(type="integer")
         */
        public $port;
    }
    
  • YAML
    1
    2
    3
    4
    5
    6
    7
    # src/AppBundle/Resources/config/validation.yml
    AppBundle\Entity\Service:
        constraints:
            - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
                fields: [host, port]
                errorPath: port
                message: 'Этот порт уже используется на данном хосте.'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!-- 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\Service">
            <constraint name="Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity">
                <option name="fields">
                    <value>host</value>
                    <value>port</value>
                </option>
                <option name="errorPath">port</option>
                <option name="message">This port is already in use on that host.</option>
            </constraint>
        </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/AppBundle/Entity/Service.php
    namespace AppBundle\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    class Service
    {
        public $host;
        public $port;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addConstraint(new UniqueEntity(array(
                'fields'    => array('host', 'port'),
                'errorPath' => 'port',
                'message'   => 'Этот порт уже используется на данном хосте.',
            )));
        }
    }
    

Теперь, сообщение будет привязано к полю port с этой конфигурацией.

ignoreNull

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

Если эта опция установлена, как true, то ограничение позволит нескольким сущностям иметь в поле значение null, а валидация будет успешной. Если установлена, как false, то позволено только одно значение null - если вторая сущность также имеет значение null, валидация будет неудачной.

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.