FOSUserBundle: удалить уникальный индекс для emailCanonical - PullRequest
11 голосов
/ 28 января 2012

Я пытаюсь удалить уникальный индекс на 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;
...
}

Заранее спасибо!

Ответы [ 3 ]

39 голосов
/ 12 июня 2013

Ответ, помеченный как прямо сейчас (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", 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 по умолчанию.Вместо этого ваша форма будет проверена только с Default группой.Описанная выше проверка UniqueEntity, в которой нет группы, будет соответствовать Default group.

7 голосов
/ 31 января 2012

Единственный способ сделать это - расширить класс FOS\UserBundle\Model\User, а затем заново выполнить все сопоставления (все в User.orm.xml).

Источники:

1 голос
/ 04 февраля 2015

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