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 ...
}
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 –
Walidator nie działa. Myślę, że istnieje problem z dziedziczeniem. – anthofremion
"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