2012-02-08 13 views
12

Ho un patner, un acquirente e una classe di amministrazione che ereditano una classe utenteerrore di convalida Symfony2 UniqueEntity con entità eredità

Quando voglio aggiungere un partner, il validatore non funzionano

* @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"}) 

Se scelgo un nome utente per un "partner" che è già presente nel database, mi mostra il giusto errore di convalida. Ma se scelgo il nome utente di un "acquirente" che è già presente nel database, non c'è alcuna verifica e ho un errore di campo univoco nei miei database.

User Class

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

Class Partner

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

Class Buyer

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

Questo sembra essere OK. La mia unica ipotesi è che l'annotazione non viene riconosciuta. Prova a farlo come hanno fatto nella documentazione: http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html –

+0

Il validatore non funziona. Penso che ci sia un problema con l'ereditarietà – anthofremion

+0

"L'ereditarietà della tabella singola è una strategia di mappatura dell'ereditarietà in cui tutte le classi di una gerarchia sono mappate su una ** sola ** tabella del database". Sembra che tu stia cercando di usare una tabella diversa per ogni classe? – Cerad

risposta

1

I miei due centesimi. Non fingere di essere la risposta giusta.

Rimuovere tutti i numeri non necessari @Table dalle sottoclassi e rendere visibili i campi (protected). Ho fatto lo stesso (con Symfony 2.0.x) e funziona come un fascino.

È leggermente diverso dal codice, qui un nome di tag (o parola chiave) è univoco per ogni utente. Ma è possibile verificare in ogni modo:

/** 
* @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; 
} 

classi figlie:

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

/** 
* @ORM\Entity 
*/ 
class Keyword extends Meta { } 
Problemi correlati