Symfony2 FOSUserBundle用户实体字段覆盖

时间:2013-03-21 08:16:20

标签: symfony doctrine-orm fosuserbundle

我在覆盖实体时遇到问题。 我需要字段emailCanonical不是唯一的。

这就是我所做的: 在我的UserBundle\Resources\config\doctrine\User.orm.xml中,我根据Doctrine2文档添加了以下attribute-overrides配置

<attribute-overrides>
    <attribute-override name="emailCanonical">
        <field column="email_canonical" unique="false" name="emailCanonical" />
    </attribute-override>
</attribute-overrides>

然后我运行了以下控制台命令

$ php app/console doctrine:migrations:diff
$ php app/console doctrine:migrations:migrate

一切都很好。 emailCanonical不是唯一的。 但是现在,当我需要在其他项目包中生成一个实体时,我有一个奇怪的错误:

 $ php app/console doctrine:generate:entities SkyModelsBundle:Category
 Generating entity "Sky\Bundle\ModelsBundle\Entity\Category"

 [Doctrine\ORM\Mapping\MappingException]
 Invalid field override named 'emailCanonical' for class 'Sky\Bundle\UserBundle\Entity\User'.

 doctrine:generate:entities [--path="..."] [--no-backup] name

但是,如果我从xml映射中删除覆盖设置,一切正常。

7 个答案:

答案 0 :(得分:10)

你使用像这样的PHP注释覆盖(从doctrine 2.3及更高版本开始支持这一点,请注意在文档中它提到你不能覆盖类型,但是我能够使用最新版本的doctrine,在撰写本文时,它是2.4.4):

<?php 
namespace Namespace\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;

/**
 * User
 * @ORM\Entity
 * @ORM\AttributeOverrides({
 *     @ORM\AttributeOverride(name="id",
 *          column=@ORM\Column(
 *              name     = "guest_id",
 *              type     = "integer",
 *              length   = 140
 *          )
 *      )
 * })
 */
class myUser extends BaseUser
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

这在以下文档中指定:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#overrides

答案 1 :(得分:3)

引自官方documentation,因此可能是唯一的方法。

  

如果您需要更改映射(例如,以适应字段   命名为遗留数据库),唯一的解决方案是编写整个   再次映射而不继承映射的映射   超类。

答案 2 :(得分:2)

我认为name标记的field属性不是必需的,因为它已经为attribute-override标记指定了

试试这个

<attribute-overrides>
    <attribute-override name="emailCanonical">
        <field column="email_canonical" unique="false" />
    </attribute-override>
</attribute-overrides>

答案 3 :(得分:1)

似乎FOSUserBundle实体未正确导入您的项目。 确保您的config.yml的“mappings”部分(“doctrine”分支)中存在FOSUserBundle

doctrine:
    orm:
        entity_managers:
            default:
                connection:       default
                mappings:
                    AcmeDemoBundle: ~
                    FOSUserBundle: ~

答案 4 :(得分:0)

刚才有同样的错误,我解决了它。当Doctrine在映射中找不到相关属性(属性或关系)时,它会在ClassMetadataInfo中抛出此Mappingexception。

因此,为了覆盖“emailCanonical”属性,您需要使用“attribute-overrides”和“attribute-override”(就像您一样),并在您的实体中重新定义php类属性:

<?php
...
class YourUser extends BaseUser
{
    ...
    /**
     * Email canonical
     *
     * @var string
     *
     * @ORM\Column(name="email_canonical", type="string", length=255, unique=false)
     */
    protected $emailCanonical;

@EDIT:使用此解决方案会导致另一个错误。

它解决了一个关于“无效的字段覆盖命名...”的问题,但在尝试使用php app/console doctrine:schema:validate命令验证模式时,我得到了另一个“列重复定义...”。

有什么想法吗?

答案 5 :(得分:0)

扩展BaseUser的类应该是这样的:

<?php 
namespace Namespace\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
 * User
 * @ORM\Entity
 * @ORM\Table(name="user")
 * @UniqueEntity(fields="email", message="your costum error message")
 *
 */
class myUser extends BaseUser
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

?>

答案 6 :(得分:0)

我知道这是一个老帖子,但我找到了一个解决方案,至少它对我有用,也许对其他人有帮助。

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

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