Удалить / заменить в поле Имя пользователя с электронной почтой с помощью FOSUserBundle в Symfony2 / Symfony3


Я только хочу иметь электронную почту в качестве режима входа, я не хочу иметь имя пользователя. Возможно ли это с symfony2/symfony3 и FOSUserbundle?

Я читаю здесь http://groups.google.com/group/symfony2/browse_thread/thread/92ac92eb18b423fe

но тогда я застрял с двумя нарушениями ограничений.

проблема в том, что если пользователь оставляет адрес электронной почты пустым, я получаю два ограничения нарушения:

  • пожалуйста, введите a имя пользователя
  • пожалуйста, введите адрес электронной почты

есть ли способ, чтобы отключить проверку для данного поля, или лучший способ удалить поле из формы?

7 54

7 ответов:

полный обзор того, что нужно сделать

вот полный обзор того, что нужно сделать. Я перечислил различные источники нашли здесь и там, в конце этого поста.

1. Переопределить сеттер в Acme\UserBundle\Entity\User

public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);

    return $this;
}

2. Удалите поле Имя пользователя из типа формы

(как RegistrationFormType и ProfileFormType)

public function buildForm(FormBuilder $builder, array $options)
{
    parent::buildForm($builder, $options);
    $builder->remove('username');  // we use email as the username
    //..
}

3. Ограничения проверки

как показано @nurikabe, мы должны избавьтесь от ограничений проверки, предоставляемых FOSUserBundle и создать свой собственный. Это означает, что нам придется воссоздать все трудности, которые были ранее созданы в FOSUserBundle и удалить те, которые касаются

я смог сделать это, переопределив как регистрацию, так и тип формы профиля detailed здесь и удаление Поля имени пользователя

$builder->remove('username');

наряду с переопределением метода setEmail в моем конкретном пользовательском классе:

 public function setEmail($email) 
 {
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);
  }

как указывает Майкл, это можно решить с помощью пользовательской группы проверки. Например:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: App\UserBundle\Entity\User
    registration:
        form:
            type: app_user_registration
            validation_groups: [AppRegistration]

затем в вашей сущности (как определено user_class: App\UserBundle\Entity\User) вы можете использовать группу AppRegistration:

class User extends BaseUser {

    /**
     * Override $email so that we can apply custom validation.
     * 
     * @Assert\NotBlank(groups={"AppRegistration"})
     * @Assert\MaxLength(limit="255", message="Please abbreviate.", groups={"AppRegistration"})
     * @Assert\Email(groups={"AppRegistration"})
     */
    protected $email;
    ...

Это то, что я закончил делать после публикации этого ответа в потоке Symfony2.

см.http://symfony.com/doc/2.0/book/validation.html#validation-groups для более подробной информации.

по состоянию на Sf 2.3, a быстрый решение это установить имя пользователя в любую строку в _construct вашего класса пользователя, который расширяет BaseUser.

public function __construct()
    {
        parent::__construct();
        $this->username = 'username';
    }

таким образом, валидатор не вызовет никаких нарушений. Но не забудьте установить адрес электронной почты на имя пользователя, опубликованное Патт.

public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);
}

возможно, вам придется проверить другие файлы на наличие ссылок на User:username и соответствующим образом изменить.

вы пробовали настроить проверку?

для этого вам нужно иметь свой собственный пакет, наследующий от UserBundle, а затем скопировать/настроить ресурсы/config/validation.XML. Кроме того, вам нужно установить validation_groups в конфигурации.yml для вашей пользовательской проверки.

вместо замены проверки я предпочитаю заменить RegistrationFormHandler#process, точнее добавить новый метод processExtended (например), который является копией исходного метода, и использовать ut в RegistrationController. (Переопределение: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md#next-steps)

перед привязкой формы регистрации я устанавливаю имя пользователя, например "пустой":

class RegistrationFormHandler extends BaseHandler
{

    public function processExtended($confirmation = false)
    {
        $user = $this->userManager->createUser();
        $user->setUsername('empty'); //That's it!!
        $this->form->setData($user);

        if ('POST' == $this->request->getMethod()) {


            $this->form->bindRequest($this->request);

            if ($this->form->isValid()) {

                $user->setUsername($user->getEmail()); //set email as username!!!!!
                $this->onSuccess($user, $confirmation);

                /* some my own logic*/

                $this->userManager->updateUser($user);
                return true;
            }
        }

        return false;
    }
    // replace other functions if you want
}

почему? Я предпочитаю пользователю Правила проверки FOSUserBundle. Потому что если я заменю группу проверки в конфигурации.yml для регистрационной формы мне нужно повторить правила проверки для пользователя в моей собственной сущности пользователя.

Если ни один из них не работает, быстрое и грязное решение будет

public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername(uniqid()); // We do not care about the username

    return $this;
}