11

複数のユーザーが同じメールアドレスを共有できるように、emailCanonicalの一意のインデックスを削除しようとしています。ただし、バンドル自体を更新すると変更が削除されるため、FOS / UserBundle / Resources / config / doctrine/User.orm.xmlを直接編集したくありません。ベースユーザー(FOS / UserBundle / Model / User.php)を拡張しながら、自分のバンドルのemailCanonicalフィールドをオーバーライドする方法はありますか?

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

class User extends BaseUser {
    protected $id;
...
}

前もって感謝します!

4

3 に答える 3

41

現在(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
{
...
}

また、ユーザーフォームの検証グループを上書きする必要があります。

# 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

私たちは何をしましたか?FOSのデフォルトの検証と一致しないように、検証グループをオーバーライドするだけです。代わりに、フォームはグループでのみ検証されますDefaultUniqueEntity上記で説明した、グループを持たない検証は、グループごとに照合されDefaultます。

于 2013-06-12T07:28:11.563 に答える
7

これを行う唯一の方法は、クラスを拡張してから、FOS\UserBundle\Model\Userすべてのマッピング(のすべてUser.orm.xml)を自分でやり直すことです。

出典:

于 2012-01-31T06:49:22.930 に答える
1

Timの答えを補足すると、YAMLを使用してこれを行う方法は次のとおりです。

My\UserBundle\Entity\User:
    type: entity
    table: null
    repositoryClass: My\UserBundle\Entity\UserRepository
    attributeOverride:
      usernameCanonical:
        unique: false
        name: usernameCanonical
        column: username_canonical
        length: 255
        nullable: false
        type: string
      emailCanonical:
        unique: false
        name: emailCanonical
        column: email_canonical
        length: 255
        nullable: false
        type: string
    fields:
        id:
          type: integer
          id: true
          generator:
              strategy: AUTO
        firstName:
          type: string
          length: 255
于 2015-02-04T11:14:09.453 に答える