繁体   English   中英

Symfony2 FOSUserBundle 用户实体字段覆盖

[英]Symfony2 FOSUserBundle User entity field override

我在覆盖实体时遇到问题。 我需要字段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 映射中删除覆盖设置,则一切正常。

您可以像这样使用 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

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

试试这个

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

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

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

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

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

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

任何的想法 ?

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

?>

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM