Почему мое ограничение 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

попробуйте добавить

framework:
    validation:
        enable_annotations: true

настройки приложения