我正在使用Symfony 2 + FOSUserBundle来管理我的用户。 问题是我想从用户名“手动”建立电子邮件地址,因此,不需要电子邮件的任何字段。
我将使用用户名创建电子邮件,因为注册的一项要求是从我的大学收到一封严格格式的电子邮件(username@schoolname.fr)。
我设法覆盖了RegistrationFormType,以避免将电子邮件字段添加到我的注册页面,但在提交表单时仍然出现“请输入电子邮件”错误。
如何阻止验证电子邮件地址以及如何从用户名“构建”它?
谢谢!
(对不起英语,我知道这不完美......)
答案 0 :(得分:3)
有一种简单的方法。它甚至是mentioned in the official FOSUserBundle documentation。你只需要覆盖控制器。
创建自己的Bundle并扩展FOSUserBundle:
class CustomUserBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
然后覆盖RegistrationController
:
class RegistrationController extends BaseController
{
public function registerAction(Request $request)
{
// here you can implement your own logic. something like this:
$user = new User();
$form = $this->container->get('form.factory')->create(new RegistrationType(), $user);
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$user->setEmail($user->getUsername() . '@' . $user->getSchoolname() . '.fr');
// and what not. Also don't forget to either activate the user or send an activation email
}
}
}
}
答案 1 :(得分:1)
您应该为fos_user.registration.initialize
编写事件监听器。来自代码文档:
/**
* The REGISTRATION_INITIALIZE event occurs when the registration process is initialized.
*
* This event allows you to modify the default values of the user before binding the form.
* The event listener method receives a FOS\UserBundle\Event\UserEvent instance.
*/
const REGISTRATION_INITIALIZE = 'fos_user.registration.initialize';
有关事件调度员的更多信息:http://symfony.com/doc/current/components/event_dispatcher/introduction.html 示例事件监听器:http://symfony.com/doc/current/cookbook/service_container/event_listener.html
更新 - 如何编码?
在config.yml
(或services.yml
或其他扩展程序,例如xml
,php
)中,定义以下服务:
demo_bundle.listener.user_registration:
class: Acme\DemoBundle\EventListener\Registration
tags:
- { name: kernel.event_listener, event: fos_user.registration.initialize, method: overrideUserEmail }
接下来,定义监听器类:
namespace Acme\DemoBundle\EventListener;
class Registration
{
protected function overrideUserEmail(UserEvent $args)
{
$request = $args->getRequest();
$formFields = $request->get('fos_user_registration_form');
// here you can define specific email, ex:
$email = $formFields['username'] . '@sth.com';
$formFields['email'] = $email;
$request->request->set('fos_user_registration_form', $formFields);
}
}
注意:当然,您可以通过向监听器注入@validator
来验证此电子邮件。
现在您应该在注册表单中隐藏email
字段。你可以通过覆盖register_content.html.twig
或(以我的意见更好的方式)覆盖FOS RegistrationFormType
来做到这一点:
namespace Acme\DemoBundle\Form\Type;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
use Symfony\Component\Form\FormBuilderInterface;
class RegistrationFormType extends BaseType
{
// some code like __construct(), getName() etc.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// some code for your form builder
->add('email', 'hidden', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
;
}
}
现在您的应用程序已准备好手动设置电子邮件。