2011-09-29 119 views
5

Estoy tratando de validar un formulario con algunos campos que deben ser únicos: nombre de usuario y dirección de correo electrónico. Si envío el formulario obtengo un error en la base de datos. Quiero usar un validador como lo hice para todo lo demás - en este momento estoy tratando de usar getters personalizados y funciones isvalidUsername en el objeto y no estoy seguro de si usar el administrador de entidades en el objeto es la mejor manera de hacerlo . Esto es lo que estoy trabajando en lo que va ...Symfony 2 validador único

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." } 

No están incorporados en los validadores únicas en el fosuserbundle pero no han sido capaces de encontrar la manera de usarlos.

Respuesta

1

Antes que nada, te recomendaría que uses FOSUserBundle. Es bastante flexible y puede ahorrar algo de tiempo gastando en corregir errores sutiles y probando si todo funciona realmente como se esperaba.

De todos modos, si realmente quiere construirlo usted mismo, al menos puede inspirar por paquete que he mencionado anteriormente. Define custom validator y verifica la exclusividad en UserManager (validateUnique). Además, debe registrarlo como service para proporcionar UserManager a través de la inyección del constructor. Entonces solo lo usa como un class validator normal.

5

Sé que esta es una vieja pregunta, pero he tenido que resolver esto, así que pensé en compartir mi solución.

que prefieren no utilizar ningún manojos para manejar mis usuarios por lo que este es mi enfoque Manual:

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

    } 

} 

Como se puede ver defino mi validación en el modelo mismo. Symfony llamará al loadValidatorMetadata para que pueda cargar validadores.

+0

Esto funcionó para mí. Tal vez es mejor usar FOSUserBundle en este caso, pero solo quería darle una bofetada a un validador de singularidad en algo sin tener que lidiar con todo eso en este momento, y esto funcionó. Gracias. –

+0

Descubrí lo que parece ser un problema con esta solución: si intenta actualizar un registro de usuario existente, se produce un error que indica que la dirección de correo electrónico ya está en uso, lo que por supuesto no debería ocurrir. –

+0

Esta solución funciona para mí, la edición y todo, así que no estoy seguro de lo que está sucediendo. No puedo verificar mi código hasta el martes, pero veré si puedo ver algo. – OrganicPanda

0

Existe la restricción de validación UniqueEntity para garantizar que el usuario proporciona un valor único para una propiedad en particular.

Por favor, consulte el documentation para obtener ejemplos usando los diversos formatos que admite Symfony. Aquí hay un ejemplo con anotaciones:

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

    // ... 
}