![](/img/trans.png)
[英]Symfony2 - FOSUserBundle set user entity field after registration
[英]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.