2011-09-29 38 views
5

sto cercando di convalidare un modulo con alcuni campi che devono essere unico - il nome utente e indirizzo email. Se invio il modulo ottengo un errore nel database. Voglio usare un validatore come ho fatto per tutto il resto - in questo momento sto cercando di usare getter personalizzati e funzioni isvalidUsername nell'oggetto e non sono sicuro se utilizzare l'entity manager nell'oggetto sia il modo migliore per farlo . Heres che cosa sto lavorando con finora ...Symfony 2 validatore unica

Frontend\UserBundle\Entity\User: 
     properties: 
      email: 
        - NotBlank: ~ 
        - Email: ~ 
     username: 
      - NotBlank: ~ 
     getters: 
       validUsername: 
        - "True": { message: "Duplicate User detected. Please use a different username." } 
       validEmail: 
        - "True": { message: "Duplicate email detected. Please use a different email." } 

Ci sono costruiti in validatori uniche nel fosuserbundle, ma non sono stati in grado di capire come usarli.

risposta

1

Prima di tutto, vi consiglio di utilizzare FOSUserBundle. È abbastanza flessibile e puoi risparmiare un po 'di tempo che passerai risolvendo bug sottili e testando se tutto funziona come previsto.

In ogni caso, se si vuole veramente costruire da soli, si può almeno ispirare dal fascio che ho citato sopra. Definiscono custom validator e verificano l'univocità in UserManager (validateUnique). Inoltre, devi registrarlo come service per fornire UserManager tramite l'iniezione del costruttore. Quindi lo usi come normale class validator.

5

So che questa è una vecchia questione, ma ho appena dovuto lavorare questo fuori così ho pensato di condividere la mia soluzione.

preferisco non usare alcun bundle al trattamento dei miei utenti quindi questo è il mio approccio manuale:

<?php 
namespace MyCorp\CorpBundle\Entity; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\Email; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** User - Represent a User object */ 
class User implements AdvancedUserInterface { 

    /** @var integer $id */ 
    private $id; 

    /** @var string $email */ 
    private $email; 

    /** Constructor, Getters, Setters etc... */ 

    /** Set a list of rules to use when validating an instance of this Class 
     @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */ 
    public static function loadValidatorMetadata(ClassMetadata $metadata) { 

     $metadata->addPropertyConstraint('email', new MaxLength(255)); 
     $metadata->addPropertyConstraint('email', new NotBlank()); 
     $metadata->addPropertyConstraint('email', new Email()); 

     $metadata->addConstraint(new UniqueEntity(array(
      "fields" => "email", 
      "message" => "This email address is already in use") 
     )); 

    } 

} 

Come potete vedere definisco la mia convalida nel modello stesso. Symfony chiamerà loadValidatorMetadata per consentire il caricamento dei validatori.

+0

Questo ha funzionato per me. Forse è meglio usare FOSUserBundle in questo caso, ma volevo solo dare uno slap a un validatore di unicità su qualcosa senza aver fatto tutto questo adesso, e questo ha fatto il trucco. Grazie. –

+0

Ho scoperto quello che sembra essere un problema con questa soluzione: se si tenta di aggiornare il record utente esistente, si ottiene un errore che dice che l'indirizzo e-mail è già in uso, il che ovviamente non dovrebbe accadere. –

+0

Questa soluzione funziona per me, la modifica e tutto, quindi non sono sicuro di cosa sta succedendo. Non posso controllare il mio codice fino a martedì ma vedrò se riesco a vedere qualcosa – OrganicPanda

0

C'è il vincolo UniqueEntity convalida per garantire che l'utente fornisce un valore univoco per una particolare proprietà.

Si prega di fare riferimento alla documentation per gli esempi che utilizzano i vari formati che Symfony supporta. Ecco un esempio usando le annotazioni:

// Acme/UserBundle/Entity/Author.php 
namespace Acme\UserBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\Mapping as ORM; 

// DON'T forget this use statement!!! 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Entity 
* @UniqueEntity("email") 
*/ 
class Author 
{ 
    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * @Assert\Email() 
    */ 
    protected $email; 

    // ... 
}