UniqueEntity

Дата оновлення перекладу 2024-05-29

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, кожний з одним полем.

Дата оновлення перекладу 2023-09-24

groups

тип: array | string за замовчуванням: null

Визначає групу або групи валідації обмеження. Прочитайте більше про групи валідації.

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-05-29

payload

тип: mixed за замовчуванням: null

Ця опція може бути використана, щоб додати довільні дані, специфічні для домену, до обмеження. Сконфігуроване корисне навантаження не використовується компонентом Validator, але його обробка повністю залежить від вас.

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

repositoryMethod

тип: string за замовчуванням: findBy()

Ім'я методу сховища, яке використовується для визначення унікальності. Якщо воно пусте, буде використано findBy(). Цей метод у якості аргументу отримує асоціативний масив fieldName => value (де fieldName - це коже з полів, сконфігурованих в опції fields). Метод має повертати обчислювану PHP-змінну.