Ограничение составного ключа Symfony2 в конструкторе форм

Как лучше всего вставить ограничение проверки составного ключа в конструктор форм, привязанное к объекту FOSUserBundle User?

Позвольте мне уточнить.

У меня есть сущность User, которая расширяет FOSUserBundle\Model\User. Я добавил несколько полей (в частности, поле team). Каждый User принадлежит ровно одному Team.

Теперь я хочу создать систему регистрации, которая позволит пользователю напрямую стать членом одной конкретной команды (имея такой маршрут, как /register/{teamSlug}). Новый пользователь должен ввести свой адрес электронной почты, но адрес электронной почты должен быть уникальным только на уровне команды. Это ограничение преобразуется в UNIQUE KEY team_email (team_id, email) в выбранной базе данных.

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

Я рассматривал возможность использования атрибута @UniqueEntity для объекта User, но, похоже, он не работает:

(Редактировать: я добавил отсутствующий оператор use.)

use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 * @UniqueEntity(
 *     fields={"email", "team"},
 *     message="This email already exists in this team."
 * )
 */
class User extends BaseUser
{
    // ...
}

Еще я нашел утверждение обратного вызова. Возможно, я мог бы использовать его, чтобы проверить, существует ли электронная почта в области действия команды, когда выполняется проверка экземпляра FormBuilder с data_class из MyBundle\Entity\User, однако это нарушит инкапсуляцию Entity, поскольку требует, чтобы Entity знала о своем собственном репозитории и так далее.

Как лучше всего это сделать?


person mr.b    schedule 08.01.2016    source источник


Ответы (1)


уникальная сущность работает нормально, но вам нужно определить правильные группы проверки, чтобы она работала с пользователем fos

@UniqueEntity(
       fields={"email", "team"},
       groups={"Registration", "Profile"},
       message="This email already exists in this team."
  )
person Marino Di Clemente    schedule 08.01.2016
comment
Я не очень ясно выразился - я добавил оператор use (без него я продолжал получать очень описательное исключение). Я отредактировал свой вопрос, чтобы отразить это. Но я не знал, что groups применимо и к @UniqueEntity. - person mr.b; 09.01.2016
comment
К сожалению нет. Я добавил UniqueEntity, как вы сказали, добавил правильные группы, настроил форму для использования правильной группы проверки. Когда я заполняю поле электронной почты и проверяю форму, она выполняет нулевые запросы к базе данных (только для этой цели я включил ведение журнала запросов mysql). - person mr.b; 10.01.2016
comment
Возможно, @UniqueEntity запускается только перед сохранением объекта в базе данных? - person mr.b; 10.01.2016