2012-02-08 25 views
12

Tôi có một patner, một người mua và một lớp quản trị kế thừa một lớp người sử dụngSymfony2 UniqueEntity xác nhận lỗi với tổ chức thừa kế

Khi tôi muốn thêm một đối tác, trình xác thực không làm việc

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

Nếu tôi chọn tên người dùng cho "đối tác" đã có trong cơ sở dữ liệu, nó sẽ cho tôi biết lỗi xác thực hợp lệ. Nhưng nếu tôi chọn tên người dùng của "người mua" đã có trong cơ sở dữ liệu, không có xác minh và có lỗi trường duy nhất trong cơ sở dữ liệu của tôi.

Lớp tài

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

Lớp 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 ... 
} 

Lớp mua

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

này có vẻ là OK. Tôi chỉ đoán rằng chú thích không được công nhận. Hãy thử làm như họ đã làm trong tài liệu: http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html –

+0

Trình xác thực không hoạt động. Tôi nghĩ rằng có một vấn đề với thừa kế – anthofremion

+0

"Thừa kế bảng đơn là một chiến lược lập bản đồ thừa kế trong đó tất cả các lớp của một hệ thống phân cấp được ánh xạ tới một bảng cơ sở dữ liệu ** đơn **. Bạn dường như đang cố gắng sử dụng một bảng khác nhau cho mỗi lớp? – Cerad

Trả lời

1

hai xu của tôi. Không giả vờ là câu trả lời đúng.

Xóa tất cả các không cần thiết @Table khỏi các lớp con và hiển thị trường (protected). Tôi đã làm khá giống nhau (với Symfony 2.0.x) và nó hoạt động như một sự quyến rũ.

Mã này hơi khác so với mã của bạn, tại đây tên thẻ (hoặc từ khóa) là duy nhất cho mỗi người dùng. Nhưng bạn có thể kiểm tra nó 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; 
} 

lớp Child:

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

/** 
* @ORM\Entity 
*/ 
class Keyword extends Meta { } 
Các vấn đề liên quan