Почему мое ограничение Symfony2 @UniqueEntity не работает вообще?
у меня есть следующий класс сущности в моем приложении:
<?php
namespace ...;
// use ...
use DoctrineORMMapping as ORM;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;;
// ...
/**
* @ORMTable(name="sc_user")
* @ORMEntity(repositoryClass="...UserRepository")
* @ORMHasLifecycleCallbacks()
* @UniqueEntity(fields={"email", "username"})
*/
class User implements UserInterface, Serializable, EquatableInterface
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $email
*
* @ORMColumn(name="email", type="string", length=255, unique=true)
*
* @AssertNotBlank(groups={"registration"})
* @AssertEmail(groups={"registration"})
*/
private $email;
/**
* @var string $username
*
* @ORMColumn(name="username", type="string", length=32, unique=true)
*
* @AssertNotBlank(groups={"registration"})
*/
private $username;
// ...
}
ограничение @UniqueEntity игнорируется. Я пробовал разные вкусы, включая:
@UniqueEntity(fields={"email", "username"})
и
@UniqueEntity(fields={"email"})
@UniqueEntity(fields={"username"})
и, согласно документации Symfony2 здесь:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html
@UniqueEntity("email")
@UniqueEntity("username")
ничего я не делаю, работает. Вместо получения ошибки проверки формы, как ожидалось, я получаю следующее исключение:
SQLSTATE[23000]: нарушение ограничения целостности: 1062 повторяющаяся запись "admin@scire.com' for key 'UNIQ_D8183973E7927C74'
Это просто неправильно! Кто-нибудь знает как исправить эту проблему?
4 ответов
проблема была решена следующим образом:
@UniqueEntity(fields={"email"}, groups={"registration"})
@UniqueEntity(fields={"username"}, groups={"registration"})
регистрационные группы отсутствовали, и мне нужно было разделить их на две отдельные аннотации.
еще одна причина этой проблемы заключается в том, что если вы используете коллекции форм и включаете подформу, которая обрабатывает Связанный объект, вы должны установить cascade_validation
to true
в корне и во всех подформах.
см. подсказку в документация Symfony:
чтобы активировать проверку на CategoryType, добавьте до
TaskType
:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\TaskBundle\Entity\Task',
'cascade_validation' => true,
));
}
обновление:
для обеспечения того, чтобы ваш ребенок сущности проверяются есть даже лучший способ. Symfony предоставляет команду Valid
ограничение именно по этой причине. От документация:
действительный
Это ограничение используется для включения проверки объектов, внедренных в качестве свойств проверяемого объекта. Это позволяет проверить объект и все связанные с ним подобъекты.
обратите внимание, ignoreNull
например, для правильной работы с pid (может быть null):
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: [page, pid, position]
errorPath: page
groups: [Menu]
message: "Page already exists with that parent"
ignoreNull: false