UniqueEntity

Дата обновления перевода 2024-07-25

UniqueEntity

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

See also

Если вы хотите валидировать, что все элементы коллекции уникальны, используйте ограничение уникальности (Unique).

Note

Для того, чтобы использовать это ограничение, вам нужно установить symfony/doctrine-bridge с помощью Composer.

??????????? ? ??????
????? UniqueEntity
????????? UniqueEntityValidator

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Entity/User.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

// НЕ забудьте следующее утверждение использования!!!
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

use Symfony\Component\Validator\Constraints as Assert;

#[ORM\Entity]
#[UniqueEntity('email')]
class User
{
    #[ORM\Column(name: 'email', type: 'string', length: 255, unique: true)]
    #[Assert\Email]
    protected string $email;
}

Caution

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

Caution

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

Опции

em

тип: string по умолчанию: null

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

entityClass

тип: string по умолчанию: null

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

errorPath

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// src/Entity/Service.php
namespace App\Entity;

use App\Entity\Host;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

#[ORM\Entity]
#[UniqueEntity(
    fields: ['host', 'port'],
    errorPath: 'port',
    message: 'This port is already in use on that host.',
)]
class Service
{
    #[ORM\ManyToOne(targetEntity: Host::class)]
    public Host $host;

    #[ORM\Column(type: 'integer')]
    public int $port;
}

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

fields

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

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

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

groups

type: array | string default: null

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

ignoreNull

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
// src/Entity/User.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

#[ORM\Entity]
#[UniqueEntity(fields: ['email', 'phoneNumber'], ignoreNull: 'phoneNumber')]
class User
{
    // ...
}

Caution

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

message

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

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

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

Вы можете использовать следующие параметры в этом сообщении:

???????? ????????
{{ value }} ??????? (??????????) ????????
{{ label }} ??????????????? ????? ???? ?????

Дата обновления перевода 2024-07-25

payload

тип: mixed по умолчанию: null

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

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

repositoryMethod

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

Имя метода хранилища, используемого для определения уникальности. Если оно пустое, то будет использован findBy(). Этот метод в качестве аргумента получает ассоциативный массив fieldName => value (где fieldName - это каждое из полей, сконфигурированных в опции fields). Метод должен возвращать исчислимую PHP-переменную.