2012-02-08 14 views
12

Tengo un patner, un comprador y una clase de administración que hereda una clase de usuarioerror de validación de Symfony2 UniqueEntity con herencia de entidades

Cuando quiero añadir un socio, el validador no trabajo

* @DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}) 
* @DoctrineAssert\UniqueEntity(fields="mail", message="Cette adresse mail est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}) 

Si elijo un nombre de usuario para un "socio" que ya está en la base de datos, me muestra el error de validación correcto. Pero si elijo el nombre de usuario de un "comprador" que ya está en la base de datos, no hay verificación, y tengo un error de campo único en mis bases de datos.

clase de usuario

<?php 

namespace Antho\Test\CoreBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder; 

/** 
* Antho\Test\CoreBundle\Entity\User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="Antho\Test\CoreBundle\Entity\UserRepository") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
* @ORM\DiscriminatorMap({"user" = "User", "partner" = "Partner", "buyer" = "Buyer", "admin" = "Admin"}) 
* @ORM\HasLifecycleCallbacks() 
* @DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}) 
* @DoctrineAssert\UniqueEntity(fields="mail", message="Cette adresse mail est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}) 
*/ 
class User implements UserInterface 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $username 
    * 
    * @ORM\Column(name="username", type="string", length=255, unique=true) 
    */ 
    private $username; 

    /** 
    * @var string $lastName 
    * 
    * @ORM\Column(name="last_name", type="string", length=255) 
    */ 
    private $lastName; 

    /** 
    * @var string $firstName 
    * 
    * @ORM\Column(name="first_name", type="string", length=255) 
    */ 
    private $firstName; 

    /** 
    * @var string $mail 
    * 
    * @ORM\Column(name="mail", type="string", length=255, unique=true) 
    */ 
    private $mail; 

    /** 
    * @var string $password 
    * 
    * @ORM\Column(name="password", type="string", length=255) 
    */ 
    private $password; 


    public function __construct() 
    { 
     if ($this->createdAt === null) { 
      $this->createdAt = new \DateTime('now'); 
     } 
     $this->isEnabled = true; 
    } 

    public function __toString() 
    { 
     return $this->username; 
    } 

    GETTER and SETTER ... 
} 

clase asociada

<?php 

namespace Antho\Test\CoreBundle\Entity; 

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

/** 
* Antho\Test\CoreBundle\Entity\Partner 
* 
* @ORM\Table(name="partner") 
* @ORM\Entity(repositoryClass="Antho\Test\CoreBundle\Entity\PartnerRepository") 
*/ 
class Partner extends User 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Restaurant", mappedBy="partner", cascade={"remove", "persist"}) 
    */ 
    private $restaurants; 

    /** 
    * @var string $company 
    * 
    * @ORM\Column(name="company", type="string", length=255) 
    */ 
    private $company; 


    public function __construct() 
    { 
     parent::__construct(); 
     $this->restaurants = new \Doctrine\Common\Collections\ArrayCollection(); 
     $this->isValid = false; 
    } 

    GETTER and SETTER ... 
} 

Clase comprador

<?php 

namespace Antho\Test\CoreBundle\Entity; 

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

/** 
* Antho\Test\CoreBundle\Entity\Buyer 
* 
* @ORM\Table(name="buyer") 
* @ORM\Entity(repositoryClass="Antho\Test\CoreBundle\Entity\BuyerRepository") 
*/ 
class Buyer extends User 
{ 
    /** 
    * @var string $address 
    * 
    * @ORM\Column(name="address", type="string", length=255) 
    */ 
    private $address; 

    /** 
    * @var string $city 
    * 
    * @ORM\Column(name="city", type="string", length=255) 
    */ 
    private $city; 

    /** 
    * @var string $zip 
    * 
    * @ORM\Column(name="zip", type="string", length=255) 
    */ 
    private $zip; 

    /** 
    * @var boolean $newsletter 
    * 
    * @ORM\Column(name="newsletter", type="boolean") 
    */ 
    private $newsletter; 


    public function __construct() 
    { 
     parent::__construct(); 
     if ($this->newsletter === null) { 
      $this->newsletter = false; 
     } 
    } 

    GETTER and SETTER ... 
} 
+0

Esto parece estar bien. Mi única conjetura es que la anotación no está siendo reconocida. Intente hacerlo como lo hicieron en la documentación: http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html –

+0

El validador no funciona. Creo que hay un problema con la herencia – anthofremion

+0

"La herencia de tabla única es una estrategia de mapeo de herencia donde todas las clases de una jerarquía se asignan a una tabla de base de datos ** única **". ¿Pareces estar intentando usar una tabla diferente para cada clase? – Cerad

Respuesta

1

Mis dos centavos. No pretende ser la respuesta correcta.

Elimine todas las @Table innecesarias de las subclases y haga que los campos sean visibles (protected). Hice lo mismo (con Symfony 2.0.x) y funciona como un encanto.

Es ligeramente diferente de su código, aquí una etiqueta (o una palabra clave) nombre es única para cada usuario. Pero se puede probar de todos modos:

/** 
* @ORM\Entity 
* @ORM\Table(
*  name="meta", 
*  uniqueConstraints={ 
*   @ORM\UniqueConstraint(columns={"name", "user_id", "type"}) 
*  }, 
*  indexes={ 
*   @ORM\index(columns={"description"}), 
*   @ORM\index(columns={"type"}) 
*  } 
*) 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
* @ORM\DiscriminatorMap({"tag" = "Tag", "keyword" = "Keyword"}) 
* @UniqueEntity(fields={"name", "user"}) 
*/ 
abstract class Meta 
{ 
    protected $name; 

    protected $user; 
} 

clases infantiles:

/** 
* @ORM\Entity 
*/ 
class Tag extends Meta { } 

/** 
* @ORM\Entity 
*/ 
class Keyword extends Meta { } 
Cuestiones relacionadas