名为“email”的字段覆盖无效

时间:2014-11-19 18:33:52

标签: symfony doctrine-orm annotations

我试图覆盖FOSUserBundle用户映射的两个属性。

use FOS\UserBundle\Model\User as BaseUser;
...
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="user")
 * @UniqueEntity(
 *     fields={"emailCanonical", "zone"},
 *     errorPath="email",
 *     message="This email address is already in use."
 * )
 * @ORM\AttributeOverrides({
 *     @ORM\AttributeOverride(name="email", column=@ORM\Column(type="string", name="email", length=255, unique=false, nullable=false)),
 *     @ORM\AttributeOverride(name="emailCanonical", column=@ORM\Column(type="string", name="emailCanonical", length=255, unique=false, nullable=false))
 * })
 */
class User extends BaseUser
{
    ...

除非我生成访问者:Invalid field override named 'email'

,否则一切似乎都运行正常

此处抛出错误:

// Doctrine\ORM\Mapping\ClassMetadataInfo

public function setAttributeOverride($fieldName, array $overrideMapping)
{
    if ( ! isset($this->fieldMappings[$fieldName])) {
        throw MappingException::invalidOverrideFieldName($this->name, $fieldName);
    }

此处,$this->fieldMappings仅包含我的子User的字段,而不包含父(映射的超类)的字段。

任何人都有线索?

4 个答案:

答案 0 :(得分:6)

我设法使用为类[class] 命名为[field]的无效字段覆盖来设置修复此问题的方法是在类I中添加覆盖的属性覆盖它。

我使用的是版本 Symfony v2.7.8 Doctrine v1.6.1

示例:

<?php

use FOS\UserBundle\Model\User as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 *
 * @ORM\HasLifecycleCallbacks
 * @ORM\AttributeOverrides({
 *     @ORM\AttributeOverride(name="usernameCanonical",
 *         column=@ORM\Column(
 *             type="string",
 *             name="username_canonical",
 *             length=255,
 *             unique=false
 *         )
 *     )
 * })
 */
class User extends BaseUser
{
    /**
     * @var string
     *
     * @ORM\Column(type="string", name="username_canonical", length=255, unique=false)
     */
    protected $usernameCanonical;
    ...
}

答案 1 :(得分:0)

修改

你是对的,在FOSUserBundle / Resources / config / doctrine / model / User.orm.xml中有映射信息...

<mapped-superclass name="FOS\UserBundle\Model\User">
    ...
    <field name="usernameCanonical" column="username_canonical" type="string" length="255" unique="true" />
    <field name="email" column="email" type="string" length="255" />

猜测:也许这个xml orm配置没有正确解析?或者你也需要在xml中进行覆盖?

答案 2 :(得分:0)

我知道这是一个老帖子,但我发现了一个问题,至少它对我有用,也许对其他人有帮助。

嗯,我有同样的问题,我在fos_user上使用自定义管理器,在doctrine entity_manager自定义管理器下的声明文件config.yml中,我声明映射到FOS_userBundle,但是缺少的是告诉我们使用不同管理器的FOS_user,并添加:

fos_user:
---- db_driver:orm
---- model_manager_name:MyCustom_Manager

答案 3 :(得分:0)

很抱歉恢复旧帖子。对我有用的是删除字段上的 ORM 注释并确保 AttributeOverride 中的名称与被覆盖的字段名称相同。

例如ff ORM 注释

/**
 * @var string
 *
 * @ORM\Column(type="string", name="username_canonical", length=255, unique=false)
 */
protected $usernameCanonical;

应该变成:

@ORM\AttributeOverride(name="usernameCanonical",
    column=@ORM\Column(
        type="string",
        name="username_canonical",
        length=255,
        unique=false
    )
)

然后,删除 ORM 注释以确保我们不会收到“列的重复映射”错误。最后的类看起来像:

<?php

use FOS\UserBundle\Model\User as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 *
 * @ORM\HasLifecycleCallbacks
 * @ORM\AttributeOverrides({
 *     @ORM\AttributeOverride(name="usernameCanonical",
 *         column=@ORM\Column(
 *             type="string",
 *             name="username_canonical",
 *             length=255,
 *             unique=false
 *         )
 *     )
 * })
 */
class User extends BaseUser
{
    /**
     * @var string
     */
    protected $usernameCanonical;
}