在尝试从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

下一篇: Doctrine2 duplicate properties and methods from trait