尝试从FOSUserBundle中的BaseUser扩展时的MappingException

时间:2014-09-23 15:17:15

标签: php symfony inheritance fosuserbundle

我正在定义一个从{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并且不能使用特征?

2 个答案:

答案 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;