РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
310 of 1361 menu

Правило UniqueEntity

Правило UniqueEntity вешается на класс сущности и проверяет, что значение указанного поля (или нескольких полей) не повторяется в таблице базы данных. Обычно применяется к полям email, login и другим, которые должны быть уникальными. Правило входит в состав компонента Validator и требует установленного пакета doctrine/orm. Первым параметром передаётся массив полей для проверки, параметр message задаёт текст ошибки, а groups - группу валидации.

Синтаксис

#[UniqueEntity(fields: ['field'], message: 'text')]

Пример

Давайте создадим сущность User с полем email и навесим на класс правило UniqueEntity:

<?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'], message: 'This email is already taken')] class User { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255, unique: true)] #[Assert\Email] private string $email = ''; public function getId(): ?int { return $this->id; } public function getEmail(): string { return $this->email; } public function setEmail(string $email): self { $this->email = $email; return $this; } } ?>

Пример

Давайте создадим форму для сущности и обработаем её в контроллере. При попытке сохранить уже существующий email форма вернёт ошибку:

<?php namespace App\Form; use App\Entity\User; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('email', EmailType::class) ->add('save', SubmitType::class); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => User::class, ]); } } ?>

Теперь обработаем форму в контроллере:

<?php namespace App\Controller; use App\Entity\User; use App\Form\UserType; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class UserController extends AbstractController { #[Route('/user/new', name: 'user_new')] public function new(Request $request, EntityManagerInterface $em): Response { $user = new User(); $form = $this->createForm(UserType::class, $user); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $em->persist($user); $em->flush(); return new Response('user saved'); } return $this->render('user/new.html.twig', [ 'form' => $form, ]); } } ?>

Если email уже занят, форма не пройдёт валидацию, а метод getErrors формы вернёт ошибку 'This email is already taken'.

Пример

Давайте проверим уникальность сразу по двум полям - email и login:

<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; #[ORM\Entity] #[UniqueEntity( fields: ['email', 'login'], message: 'This email and login are already taken' )] class User { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255)] private string $email = ''; #[ORM\Column(length: 255)] private string $login = ''; public function getId(): ?int { return $this->id; } } ?>

Теперь правило сработает только тогда, когда одновременно совпадут и email, и login.

Пример

Давайте укажем собственный репозиторий через параметр repositoryMethod и имя поля через em. Это полезно, когда имя свойства сущности отличается от имени колонки:

<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; #[ORM\Entity(repositoryClass: UserRepository::class)] #[UniqueEntity( fields: ['email'], repositoryMethod: 'findByEmail', message: 'Email is not unique' )] class User { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255)] private string $email = ''; public function getId(): ?int { return $this->id; } public function getEmail(): string { return $this->email; } } ?>

Метод findByEmail должен быть объявлен в репозитории UserRepository:

<?php namespace App\Repository; use App\Entity\User; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; class UserRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, User::class); } public function findByEmail(string $email): ?User { return $this->findOneBy(['email' => $email]); } } ?>

Смотрите также

  • правило NotBlank,
    которое проверяет, что поле не пустое
  • правило Email,
    которое проверяет корректность email-адреса
  • правило Length,
    которое задаёт допустимую длину строки
  • класс Form,
    который представляет форму и управляет её полями
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить