FOSUserBundle: удалить уникальный индекс для emailCanonical

Я пытаюсь удалить уникальный индекс в emailCanonical, чтобы несколько пользователей могли использовать один и тот же адрес электронной почты. Тем не менее, я не хочу редактировать FOS/UserBundle/Resources/config/doctrine/User.orm.xml напрямую, так как любые обновления самого пакета удаляют это изменение. Есть ли способ переопределить поле 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;
...
}

Спасибо заранее!

Ответ 2

Ответ, отмеченный как прямо сейчас (14 октября 2014 г.), не является правильным ответом.

Это единственное правильное решение:

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", [email protected]\Column(type="string", name="email", length=255, unique=false, nullable=true)),
 *      @ORM\AttributeOverride(name="emailCanonical", [email protected]\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 по умолчанию. Вместо этого ваша форма будет проверена только с помощью группы Default. Описанная выше проверка UniqueEntity, которая не имеет какой-либо группы, будет соответствовать группе Default.

Ответ 3

Дополнение к ответу Тима, вот как вы это сделаете с помощью 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