2012-01-05 4 views
4

Привет У меня есть свой собственный User Класс, который наследует FOS\UserBundle\Entity\User. Кроме того, я написал свою собственную процедуру регистрации. Теперь у меня есть проблема, что форма не гарантирует, что имя пользователя уникально. Я всегда получаю SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'myusername' for key 'UNIQ_2DA1797792FC23A8'Symfony2: Как сделать имя пользователя пользователя FOSUserBundle уникальным

Я попытался добавить аннотацию @UniqueEntity("email"), как указано в документации [1], но без какого-либо эффекта.

Кто-то знает, что может быть неправильным?

[1] http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

ответ

10

Ограничение существует в ФОС расслоение уже. Вероятно, вам нужно установить опцию validation_groups в вашей форме на array('Registration').

+0

Это не имеет никакого эффекта:/больше идей? – stoefln

+0

Однако, вот ссылка на документацию: http://symfony.com/doc/2.0/book/forms.html#book-forms-validation-groups – stoefln

+2

опубликовала вопрос о github. там есть большая команда поддержки. Большое спасибо @stof за указание, что я фактически не проверял объект пользователя, а только данные формы. Дополнительная информация: https://github.com/FriendsOfSymfony/FOSUserBundle/issues/480 – stoefln

0

Вы можете попробовать это на validation.yml с проверкой объекта пользователя:

constraints:  
    - FOS\UserBundle\Validator\Unique: 
     property: usernameCanonical 
     message: 'This username already exists. Please choose another one.' 
12

Если вы используете пакет fos_user, вы можете просто использовать UniqueEntity ограничение: http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html.

Чтобы осуществить это, просто убедитесь, что ваш класс User constains соответствующих заявлений использовать, а затем аннотации, например, так (при условии, что вы используете аннотации):

<?php 
// ... 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
* @UniqueEntity("email") 
* @UniqueEntity("username") 
*/ 
class User extends BaseUser 
{ /* ... */ } 
+1

Просто хотел сказать спасибо Vraxoin! Во время моих модульных тестов я получал уродливое нарушение уровня БД (SQLSTATE [23000]: нарушение ограничений целостности), когда я пытался зарегистрировать имя пользователя, которое уже существует ... Я искал высоко и низко и нашел много сложных ответов (большинство из них действительно кажется, что они решат проблему). По прихоти я дал этот снимок (всего 4 строки, чтобы скопировать и вставить прямо?), И теперь мои неуникальные попытки регистрации теперь обрабатываются изящно (FOSUB теперь перенаправляет пользователя в регистрационную форму снова, а не исключение БД). Спасибо Спасибо спасибо! – jfgrissom