【问题标题】:Symfony2 FOSUserBundle User entity field overrideSymfony2 FOSUserBundle 用户实体字段覆盖
【发布时间】:2013-03-21 08:16:20
【问题描述】:

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

这是我所做的: 根据 Doctrine2 文档,在我的 UserBundle\Resources\config\doctrine\User.orm.xml 中,我添加了以下 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 映射中删除覆盖设置,一切正常。

【问题讨论】:

  • 我不确定,你的问题是什么。
  • 这是我解决它的方法.. 你可以试试这个:stackoverflow.com/a/17059918/2342137
  • 我也有同样的问题。我使用注释来覆盖相同的属性,直到我尝试使用教义:生成:实体时才意识到存在问题。你找到解决方案了吗?

标签: symfony doctrine-orm fosuserbundle


【解决方案1】:

您可以像这样使用 PHP 注释进行覆盖(从教义 2.3 版及更高版本开始支持,请注意,在文档中它提到您不能覆盖类型,但是我能够使用最新版本的教义来做到这一点,在撰写本文时它是 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

【讨论】:

    【解决方案2】:

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

    试试这个

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

    【讨论】:

      【解决方案3】:

      引用来自官方documentation,所以可能是唯一的方法。

      如果您需要更改映射(例如调整字段 名称到旧数据库),唯一的解决方案是编写整个 再次映射而不从映射的继承映射 超类。

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        刚才遇到了同样的错误,我解决了。当 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 命令验证架构时,我得到了另一个“列的重复定义...”。

        有什么想法吗?

        【讨论】:

        • 你找到解决办法了吗?
        • 我没有找到除上述解释之外的任何其他解决方案:/ 我一直在为这些错误寻找“干净”的解决方案
        【解决方案6】:

        你的扩展 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;
        }
        
        ?>
        

        【讨论】:

          【解决方案7】:

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

          好吧,我遇到了同样的问题,我正在为 fos_user 使用自定义管理器,在声明文件 config.yml 中的学说 entity_manager 自定义管理器下,我声明了到 FOS_userBundle 的映射,但缺少的是告诉 FOS_user我们使用不同的经理,那就是添加:

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

          【讨论】:

            猜你喜欢
            • 2012-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-13
            • 1970-01-01
            • 1970-01-01
            • 2012-11-10
            • 1970-01-01
            相关资源
            最近更新 更多