FOSUserBundle:删除emailCanonical的唯一索引

Ott*_*Yiu 11 symfony fosuserbundle

我试图删除emailCanonical上的唯一索引,以便多个用户可以共享相同的电子邮件地址.但是,我不想直接编辑FOS/UserBundle/Resources/config/doctrine/User.orm.xml,因为对bundle本身的任何更新都将删除更改.有没有什么办法可以覆盖我自己的bundle中的emailCanonical字段,同时扩展基本用户(FOS/UserBundle/Model/User.php)

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Foo\BarBundle\Constant\SecurityConstant;

class User extends BaseUser {
    protected $id;
...
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Tim*_*Tim 40

现在标记为(2014年10月14日)的答案根本不是正确的答案.

这是唯一正确的解决方案:

namespace XXX\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="User_User")
 * @ORM\Entity(repositoryClass="UserRepository")
 * @UniqueEntity(fields="usernameCanonical", errorPath="username", message="fos_user.username.already_used")
 * @ORM\AttributeOverrides({
 *      @ORM\AttributeOverride(name="email", column=@ORM\Column(type="string", name="email", length=255, unique=false, nullable=true)),
 *      @ORM\AttributeOverride(name="emailCanonical", column=@ORM\Column(type="string", name="email_canonical", length=255, unique=false, nullable=true))
 * })
 */
class User extends BaseUser
{
...
}
Run Code Online (Sandbox Code Playgroud)

您还需要覆盖用户表单的验证组:

# app/config/config.yml
...
fos_user:
profile:
    form:
        validation_groups:  [Default] # Here you can also add your own groups if you have extra validation
registration:
    form:
        validation_groups:  [Default] # Here you can also add your own groups if you have extra validation
Run Code Online (Sandbox Code Playgroud)

我们做了什么?我们只是将验证组覆盖为与FOS默认验证不匹配.相反,您的表单将仅与Default组验证.以上描述的UniqueEntity没有任何组的验证将由Default组匹配.

  • 请小心,因为只有第一个用户才能通过电子邮件重置密码. (2认同)
  • 这给了我一个错误:`名为'email'的无效字段覆盖.不知何故,`ClassMetadataInfo :: fieldMappings`只包含子类的领域,而不是父类(其中包含电子邮件字段我想重写).仅在生成实体时抛出此错误. (2认同)

lee*_*eek 7

执行此操作的唯一方法是扩展FOS\UserBundle\Model\User类,然后自己重​​新执行所有映射(所有内容User.orm.xml).

资料来源: