Як застосувати лише підмножину усіх ваших обмежень валідації (групи валідації)
Дата оновлення перекладу 2025-09-22
Як застосувати лише підмножину усіх ваших обмежень валідації (групи валідації)
За замовчуванням, при валідації обʼєкта, всі обмеження цього класу будуть перевірені на предмет того, чи дійсно вони підійдуть. Однак, у деяких випадках, вам знадобиться валідувати обʼєкт лише по відношенню до деяких обмежень цього класу. Щоб зробити це, ви можете організувати кожне обмеження в одну та більше "груп валідації", а потім застосувати валідацію лише до однієї групи обмежень.
Наприклад, уявіть, що у вас є клас User, який використовується як при реєстрації
користувача, так і при оновленні контактної інформації пізніше:
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 Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
class User implements UserInterface
{
#[Assert\Email(groups: ['registration'])]
private string $email;
#[Assert\NotBlank(groups: ['registration'])]
#[Assert\Length(min: 7, groups: ['registration'])]
private string $password;
#[Assert\Length(min: 2)]
private string $city;
}
У такій конфігурації існує три групи валідації:
Default- Містить обмеження у поточному класі і всі згадані класи, які не належать до жодної групи.
User-
Еквівалентна усім обмеженням обʼєкта
Userв групіDefault. Це завжди є іменем класу. Різниця між цією групою іDefaultпояснюється у Як послідовно застосовувати групи валідації. registration-
Це користувацька група валідації, тому вона містить лише обмеження, які чітко
асційовані з нею. У цьому прикладі, лише поля
emailтаpassword.
Обмеження у групі класу Default - це обмеження, які або не мають чітко сконфігурованої
групи, або які сконфігуровані у групу, що дорівнює іменя класу або рядку
Default.
Warning
При валідації лише обʼєкта Користувача, не існує різниці між групами Default
і User. Але різниця існує, якщо User має вбудовані обʼєкти. Наприклад,
уявіть, що User має властивість address, яка містить деякий обʼєкт Address,
і що ви додали обмеження Valid до цієї властивості,
щоб вона була валідована при валідації обʼєкта User.
Якщо ви валідуєте User, використовуючи групу Default, то будь-які обмеження
у класі Address, які знаходяться в групі Default будуть використані. Але,
якщо ви валідуєте User, використовуючи групу валідації User, тоді будуть
валідовані лише обмеження класу Address.
Іншими словами, група Default і група класу імені (наприклад, User) ідентичні,
окрім випадків, коли клас вбудований в інший обʼєкт, ніж той, валідація якого проводиться.
Якщо у вас є наслідування (наприклад, User extends BaseUser) і ви валідуєте з класом
імені підкласу (тобто, User), то всі обмеження в User і BaseUser будуть валідовані.
Однак, якщо ви валідуєте, використовуючи базовий класс (тобто, BaseUser), то будуть
валідовані лише обмеження за замовчуванням у класі BaseUser.
Щоб повідомити валідатору про використання конкретної групи, передайте одне або більше
імен груп в якості третього аргументу методу validate():
1
$errors = $validator->validate($author, null, ['registration']);
Якщо не вказана жодна група, будуть застосовані всі обмеження, які належать до групи
Default
Авжеж, ви частіше працюватимете з валідацією не напряму, а через бібліотеку форм. Для інформації про те, як використовувати групи валідації всередині форм, дивіться Як визначити, які групи валідації використовувати.