1

我正在使用 Symfony 2 + FOSUserBundle 来管理我的用户。问题是我想从用户名“手动”构建电子邮件地址,因此不需要电子邮件的任何字段。

我将从用户名创建电子邮件,因为注册的一个要求是拥有来自我的大学的电子邮件,其格式严格(username@schoolname.fr)。

我设法覆盖了 RegistrationFormType 以避免将电子邮件字段添加到我的注册页面,但是当我提交表单时仍然出现错误“请输入电子邮件”。

如何防止验证电子邮件地址以及如何从用户名“构建”它?

谢谢!

(对不起英语,我知道它并不完美......)

4

2 回答 2

3

有一个简单的方法。它甚至在官方 FOSUserBundle 文档中被提及。您只需要覆盖控制器。

创建您自己的 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

            }
        }
    }
}
于 2013-08-05T20:28:34.393 回答
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'))
        ;
    }
}

现在您的应用程序已准备好手动设置电子邮件。

于 2013-08-05T21:14:16.030 回答