在尝试从FOSUserBundle中的BaseUser进行扩展时发生MappingException
我正在定义一个从FOSUserBundle BaseUser
扩展的Usuario
实体,我按照如下方式执行:
namespace UsuarioBundleEntity;
use FOSUserBundleModelUser as BaseUser;
use DoctrineORMMapping as ORM;
use GedmoMappingAnnotation as Gedmo;
use GedmoTimestampableTraitsTimestampableEntity;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;
use DoctrineCommonCollectionsArrayCollection;
use MisdPhoneNumberBundleValidatorConstraintsPhoneNumber as AssertPhoneNumber;
/**
* @ORMEntity
* @ORMTable(name="usuarios_externos.usuarios", schema="usuarios_externos")
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="discr", type="string")
* @ORMDiscriminatorMap({
* "natural" = "Natural",
* "empresa" = "Empresa"
* })
* @UniqueEntity(fields={"correo_alternativo"}, message="El correo electrónico ya está siendo usado, por favor introduzca otro.")
* @GedmoSoftDeleteable(fieldName="deletedAt", timeAware=false)
*/
class Usuario extends BaseUser {
/**
* Hook timestampable behavior
* updates createdAt, updatedAt fields
*/
use TimestampableEntity;
...
public function getId()
{
return $this->id;
}
....
}
但是我得到这个错误:
MappingException:没有为“FOS UserBundle Model User”的实体“UsuarioBundle Entity Usuario”子类指定标识符/主键。 每个实体必须有一个标识符/主键。
为什么? 有没有FOS User
实体的id
字段定义为PK?
奇怪的问题,而尝试添加字段使用特质
由于我将在许多表中使用ID
字段,并且为了重复删除代码并遵循良好实践,我决定使用Trait。 这是它的外观:
namespace ComunBundleModel;
use DoctrineORMMapping as ORM;
trait IdentifierAutogeneratedEntityTrait {
/**
* @ORMId
* @ORMColumn(type="integer", nullable=false, unique=true)
* @ORMGeneratedValue(strategy="SEQUENCE")
*/
protected $id;
public function getId()
{
return $this->id;
}
}
现在我将这个特征包含在Usuario
实体中:
use ComunBundleModelIdentifierAutogeneratedEntityTrait;
并尝试在实体类中使用:
class Usuario extends BaseUser {
use IdentifierAutogeneratedEntityTrait;
...
}
有同样的错误,为什么不认识这个特质?
UPDATE
我运行了命令doctrine:schema:validate
从Symfony2 shell doctrine:schema:validate
,并得到以下输出:
[Symfony Component Debug Exception ContextErrorException]运行时注意:FOS UserBundle Model User和ComunBundle Model Id
entifierAutogeneratedEntityTrait在UsuarioBundle Entity Usuario的组合中定义了相同的属性($ id)。 这可能是不兼容的,为了提高可维护性,考虑在特性中使用访问器方法。 Class由/ var / www / html / sencamer / src / UsuarioBund组成
le / Entity / Usuario.php第500行
我是否需要在实体中定义$id
并且不能使用Trait?
FOS用户模型具有id属性,但不提供对该属性的id
映射。 您必须重写id
属性并提供所需的注释。
//excerpt from the FOSUserbundle doctrine mapping config
<mapped-superclass name="FOSUserBundleModelUser">
<field name="username" column="username" type="string" length="255" />
<field name="usernameCanonical" column="username_canonical" type="string" length="255" unique="true" />
您可以看到,它不提供id字段的映射信息。 你需要将它添加到你的实体。
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
FOSUserBundleModelUser
是“存储不可知的用户对象”。 用更详细的定义覆盖实体中的id
:
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
链接地址: http://www.djcxy.com/p/69383.html
上一篇: MappingException while trying to extends from BaseUser in FOSUserBundle