我正在定义一个从{FOSUserBundle Usuario
扩展的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:没有为Entity指定标识符/主键 “UsuarioBundle \ Entity \ Usuario”子类 “FOS \ UserBundle \型号\用户”。每个实体必须有一个 标识符/主键。
为什么呢? FOS User
实体没有定义为PK的id
字段吗?
尝试使用特征添加字段时出现奇怪的问题
由于我在许多表中都有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;
...
}
得到同样的错误,为什么不识别这个特性?
更新
我从Symfony2 shell运行命令doctrine:schema:validate
,我得到了这个输出:
[Symfony \ Component \ Debug \ Exception \ ContextErrorException]运行时 注意:FOS \ UserBundle \ Model \ User和ComunBundle \ Model \ Id
entifierAutogeneratedEntityTrait定义了相同的属性($ id) UsuarioBundle \ Entity \ Usuario的组成部分。这可能是 不兼容,考虑使用访问器来提高可维护性 特征中的方法。班级是由 在/ var / www / html等/ sencamer / src目录/ UsuarioBund
le / Entity / Usuario.php第500行
我是否需要在实体中定义$id
并且不能使用特征?
答案 0 :(得分:2)
FOS\UserBundle\Model\User
是“与存储无关的用户对象”。使用更详细的定义覆盖实体中的id
:
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
答案 1 :(得分:2)
FOS用户模型具有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;