Я определяю Usuario
сущность, которая выходит из FOSUserBundle BaseUser
и я делаю это следующим образом:
namespace UsuarioBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\Common\Collections\ArrayCollection;
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber;
/**
* @ORM\Entity
* @ORM\Table(name="usuarios_externos.usuarios", schema="usuarios_externos")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({
* "natural" = "Natural",
* "empresa" = "Empresa"* })
* @UniqueEntity(fields={"correo_alternativo"}, message="El correo electrónico ya está siendo usado, por favor introduzca otro.")
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
*/
class Usuario extends BaseUser {
/**
* Hook timestampable behavior
* updates createdAt, updatedAt fields
*/
use TimestampableEntity;
...
public function getId()
{
return $this->id;
}
....
}
Но я получаю эту ошибку:
MappingException: для сущности не указан идентификатор / первичный ключ
Подкласс «UsuarioBundle \ Entity \ Usuario»
«FOS \ UserBundle \ Model \ User». Каждый субъект должен иметь
идентификатор / первичный ключ.
Зачем? Не имеет ФОС User
сущность а id
поле определяется как PK?
Странная проблема при попытке добавить поле с помощью черт
Так как я буду иметь ID
во многих таблицах, для дублирования кода и следования передовой практике, я решил использовать для него черту. Вот как это выглядит:
namespace ComunBundle\Model;
use Doctrine\ORM\Mapping as ORM;
trait IdentifierAutogeneratedEntityTrait {
/**
* @ORM\Id
* @ORM\Column(type="integer", nullable=false, unique=true)
* @ORM\GeneratedValue(strategy="SEQUENCE")
*/
protected $id;
public function getId()
{
return $this->id;
}
}
Теперь я включаю черту на Usuario
юридическое лицо:
use ComunBundle\Model\IdentifierAutogeneratedEntityTrait;
И попробуйте использовать в классе сущности:
class Usuario extends BaseUser {
use IdentifierAutogeneratedEntityTrait;
...
}
Получил ту же ошибку, почему не признает черту?
ОБНОВИТЬ
Я управлял командой doctrine:schema:validate
из оболочки Symfony2 и я получаю этот вывод:
[Symfony \ Component \ Debug \ Exception \ ContextErrorException] Время выполнения
Примечание: FOS \ UserBundle \ Model \ User and ComunBundle \ Model \ Id
entifierAutogeneratedEntityTrait определяет то же свойство ($ id) в
состав UsuarioBundle \ Entity \ Usuario. Это может быть
несовместимо, чтобы улучшить удобство обслуживания рассмотрите использование аксессора
методы в чертах характера. Класс был составлен в
/ Вар / WWW / HTML / sencamer / SRC / UsuarioBund
le / Entity / Usuario.php line 500
Нужно ли мне определить $id
в сущности и не можете использовать черту?
Модель FOS User имеет свойство id, но не предоставляет id
сопоставление с этим свойством. Вы должны переопределить id
собственность и поставьте необходимую аннотацию.
//excerpt from the FOSUserbundle doctrine mapping config
<mapped-superclass name="FOS\UserBundle\Model\User">
<field name="username" column="username" type="string" length="255" />
<field name="usernameCanonical" column="username_canonical" type="string" length="255" unique="true" />
Как видите, он не предоставляет информацию для отображения поля id. Вы должны добавить это к своей сущности.
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
FOS\UserBundle\Model\User
является «независимым от хранилища пользовательским объектом». Override id
в вашей сущности с более подробным определением:
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;