2012-08-17 13 views
7

Ho la seguente classe di entità nella mia domanda:Perché il mio vincolo Symfony2 @UniqueEntity non funziona affatto?

<?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; 

    // ... 
} 

Il vincolo @UniqueEntity viene ignorato. Ho provato gusti diversi tra cui:

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

e

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

e, come per la documentazione di Symfony2 qui: http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

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

Nulla che faccio, funziona. Invece di ottenere un errore di validazione dei form come previsto, io sono sempre la seguente eccezione:

SQLSTATE [23000]: Integrità violazione del vincolo: 1.062 voce duplicata '[email protected]' per la chiave 'UNIQ_D8183973E7927C74'

Questo è semplicemente sbagliato! Qualcuno sa come risolvere questo problema?

risposta

20

Il problema è stato risolto nel modo seguente:

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

I gruppi di registrazione mancavano, e avevo bisogno di separarli in due annotazioni separate.

+0

+1 grazie! quello ha funzionato a meraviglia! – coder4show

+2

Ciao Josef, sembra una domanda un po 'vecchia, ma sto avendo lo stesso problema che avevi - mi stavo chiedendo - hai avuto bisogno, non so, __create__ quel gruppo di validazione da qualche parte? Ho aggiunto il campo entità unico esattamente come hai fatto tu, solo su email e cellulare, ma mi sta ancora dando un'eccezione invece di un errore di convalida. Qualche idea? – iLikeBreakfast

+1

@iLikeBreakfast è necessario dichiarare il gruppo di convalida nel metodo 'setDefaultOptions' nel proprio' FormType' – ferdynator

1

tenta di aggiungere

framework: 
    validation: 
     enable_annotations: true 

alla configurazione app

11

Un altro motivo per questo problema è se si utilizzano raccolte di moduli e si include un sottomodulo che gestisce un'entità associata, è necessario impostare cascade_validation in true nella radice e in tutti i moduli secondari.

Vedi il suggerimento nella Symfony documentation:

Per attivare la convalida sul CategoryType, aggiungere il cascade_validation opzione per TaskType:

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

Aggiornamento:

Per garantire che le entità del tuo bambino sono convalidate, c'è persino un modo migliore. Symfony fornisce il vincolo Valid esattamente per questo motivo. Da documentation:

valido
Questo vincolo viene utilizzato per abilitare la convalida su oggetti che sono incorporati come proprietà di un oggetto che viene convalidato. Ciò consente di convalidare un oggetto e tutti gli oggetti secondari ad esso associati.

+0

Questo è il solo una risposta utile e corretta qui. – VisioN

3

Si prega di notare ignoreNull

Ad esempio funzioni correttamente con il PID (può essere nullo):

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

Questa è stata la risposta al mio problema. Grazie! – nataliastanko