Удалить / заменить в поле Имя пользователя с электронной почтой с помощью FOSUserBundle в Symfony2 / Symfony3
Я только хочу иметь электронную почту в качестве режима входа, я не хочу иметь имя пользователя. Возможно ли это с symfony2/symfony3 и FOSUserbundle?
Я читаю здесь http://groups.google.com/group/symfony2/browse_thread/thread/92ac92eb18b423fe
но тогда я застрял с двумя нарушениями ограничений.
проблема в том, что если пользователь оставляет адрес электронной почты пустым, я получаю два ограничения нарушения:
- пожалуйста, введите a имя пользователя
- пожалуйста, введите адрес электронной почты
есть ли способ, чтобы отключить проверку для данного поля, или лучший способ удалить поле из формы?
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 для регистрационной формы мне нужно повторить правила проверки для пользователя в моей собственной сущности пользователя.