2012-08-17 20 views
7

que tienen la siguiente clase de entidad en mi solicitud:¿Por qué mi restricción Symfony2 @UniqueEntity no funciona en absoluto?

<?php 

namespace ...; 

// use ... 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;; 
// ... 

/** 
* @ORM\Table(name="sc_user") 
* @ORM\Entity(repositoryClass="...\UserRepository") 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity(fields={"email", "username"}) 
*/ 
class User implements UserInterface, \Serializable, EquatableInterface 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * 
    * @Assert\NotBlank(groups={"registration"}) 
    * @Assert\Email(groups={"registration"}) 
    */ 
    private $email; 

    /** 
    * @var string $username 
    * 
    * @ORM\Column(name="username", type="string", length=32, unique=true) 
    * 
    * @Assert\NotBlank(groups={"registration"}) 
    */ 
    private $username; 

    // ... 
} 

La restricción @UniqueEntity está siendo ignorada. Probé diferentes sabores que incluyen:

@UniqueEntity(fields={"email", "username"}) 

y

@UniqueEntity(fields={"email"}) 
@UniqueEntity(fields={"username"}) 

y, según la documentación de Symfony2 aquí: http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

@UniqueEntity("email") 
@UniqueEntity("username") 

Nada de lo que hago, funciona. En lugar de obtener un error de validación de formularios como se esperaba, me estoy haciendo la siguiente excepción:

SQLSTATE [23000]: violación de integridad: 1062 Entrada duplicada '[email protected]' para la llave 'UNIQ_D8183973E7927C74'

¡Esto simplemente está mal! ¿Alguien sabe cómo solucionar este problema?

Respuesta

20

El problema se resolvió de la siguiente manera:

@UniqueEntity(fields={"email"}, groups={"registration"}) 
@UniqueEntity(fields={"username"}, groups={"registration"}) 

Los grupos de registro faltaban, y que tenía que separarlos en dos Anotaciones separadas.

+0

1 gracias! eso funcionó un placer! – coder4show

+2

Hola, Josef, parece una pregunta un poco vieja, pero estoy teniendo el mismo problema que tú, solo me preguntaba si era necesario, no sé, crear ese grupo de validación en alguna parte. Agregué el campo de entidad único exactamente como lo hizo, solo en el correo electrónico y el teléfono celular, pero todavía me da una excepción en lugar de un error de validación. ¿Algunas ideas? – iLikeBreakfast

+1

@iLikeBreakfast usted necesita declarar el grupo de validación en su método 'setDefaultOptions' en su' FormType' – ferdynator

1

intenta agregar

framework: 
    validation: 
     enable_annotations: true 

a la configuración de aplicación

11

Otro motivo de este problema es que si utiliza colecciones de formularios e incluye un formulario secundario que maneja una entidad asociada, debe establecer cascade_validation en true en la raíz y todas las formas secundarias.

Véase la pista en el Symfony documentation:

Para activar la validación de CategoryType, agregue el cascade_validation opción de TaskType:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Acme\TaskBundle\Entity\Task', 
     'cascade_validation' => true, 
    )); 
} 

Actualización:

Para asegurarse de que sus entidades hijas son validadas, incluso hay una mejor manera. Symfony proporciona la restricción Valid por exactamente este motivo. De documentation:

Válido
Esta restricción se utiliza para activar la validación de los objetos que están incrustados como propiedades en un objeto en proceso de validación. Esto le permite validar un objeto y todos los sub-objetos asociados con él.

+0

Este es el solo respuesta útil y correcta aquí. – VisioN

3

Tenga en cuenta ignoreNull

Por ejemplo funcione correctamente con pid (puede ser nulo):

constraints: 
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
    fields: [page, pid, position] 
    errorPath: page 
    groups: [Menu] 
    message: "Page already exists with that parent" 
    ignoreNull: false 
+0

Esa fue la respuesta a mi problema. ¡Gracias! – nataliastanko

Cuestiones relacionadas