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-змінну.