2012-02-08 4 views
12

Mam patner, kupujący i klasę administratora, które dziedziczą klasę użytkownikabłąd walidacji Symfony2 UniqueEntity z jednostki dziedziczenia

Gdy chcę dodać partnera, walidator nie działają

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

Jeśli wybiorę nazwę użytkownika do "partnera", który jest już w bazie danych, pokazuje mi właściwy błąd sprawdzania poprawności. Ale jeśli wybiorę nazwę użytkownika "kupującego", który jest już w bazie danych, nie ma weryfikacji i mam unikalny błąd pola w moich bazach danych.

Class User

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

Klasa Kupujący

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

To wydaje się być OK. Przypuszczam, że adnotacja nie jest rozpoznawana. Spróbuj zrobić to tak, jak zrobili to w dokumentacji: http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html –

+0

Walidator nie działa. Myślę, że istnieje problem z dziedziczeniem. – anthofremion

+0

"Dziedziczenie pojedynczej tabeli jest strategią odwzorowania dziedziczenia, w której wszystkie klasy hierarchii są odwzorowane na ** pojedynczą tabelę bazy danych **. Wydaje się, że próbujesz użyć innej tabeli dla każdej klasy? – Cerad

Odpowiedz

1

Moje dwa centy. Nie udawać, że jest właściwą odpowiedzią.

Usuń wszystkie niepotrzebne @Table z podklas i pokaż pola (protected). Zrobiłem to samo (z Symfony 2.0.x) i działa jak urok.

To trochę różni się od kodu, tutaj nazwa tagu (lub słowa kluczowego) jest unikalna dla każdego użytkownika. Ale można go przetestować anyways:

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

klas dziecko:

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

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