自定义表单仅接受特定电子邮件地址FOSUserBundle 2.0/Symfony3

自定义表单仅接受特定电子邮件地址FOSUserBundle 2.0/Symfony3,symfony,fosuserbundle,event-listener,Symfony,Fosuserbundle,Event Listener,我试图学习使用Symfony 3.1.10创建网站。为了帮助我在项目中创建登录/注册,我决定使用捆绑包“FOSUserBundle 2.0”。所以现在我创建了一个自定义表单(我按名称字段更改了用户名字段)。对于我的项目,我尝试只允许注册具有特定电子邮件地址的用户。因此,在很少的研究之后,他们解释了如何创建自定义行为,FOSUserbundle创建了事件。所以,当我成功注册时,我会创建自定义事件侦听器,如您在下面看到的 class CheckEmailBefore implements Event

我试图学习使用Symfony 3.1.10创建网站。为了帮助我在项目中创建登录/注册,我决定使用捆绑包“FOSUserBundle 2.0”。所以现在我创建了一个自定义表单(我按名称字段更改了用户名字段)。对于我的项目,我尝试只允许注册具有特定电子邮件地址的用户。因此,在很少的研究之后,他们解释了如何创建自定义行为,FOSUserbundle创建了事件。所以,当我成功注册时,我会创建自定义事件侦听器,如您在下面看到的

class CheckEmailBefore implements EventSubscriberInterface {

private $router;
private $request;

public function __construct(RouterInterface $router,Request $request)
{
    $this->router = $router;
    $this->request = $request;
}

public static function getSubscribedEvents() {
    return [
        FOSUserEvents::REGISTRATION_SUCCESS => 'onCheck'
    ];
}


/**
 * @param FormEvent $event
 *
 */
public function onCheck(FormEvent $event){

    $user = $event->getForm()->getData();
    $email = $user->getEmailCanonical();

    $format = explode("@",$email);

    if((strcmp($format[1] , "truc.com")===0) || (strcmp($format[1] , "chose.com") === 0)){

        $url = $this->router->generate('list');
        $response = new RedirectResponse($url);
        $event->setResponse($response);


    }else{
        $event->getForm()->addError(new FormError("Enter a mail address with valid format"), 1);
        var_dump($event->getForm()->getErrors());

        die("Address is not valid");
    }






}
}
我的问题是,一旦我添加了一个错误,我就不知道如何在我的表单上显示它,就像包已经创建的错误一样


提前感谢。

我不会为此使用事件调度器组件,我只会更简单地创建一个自定义验证约束。这是

您可以创建一个约束来检查您的用户的电子邮件中是否有特定的域。如果约束未通过,验证将失败,因此,注册过程将为您提供正确的错误信息

文档解释得很好,但是如果您需要帮助实现,请告诉我,我可以更新我的答案

更新:

class RegistrationForm extends OtherForm
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder
            ->add('firstName', TextType::class, [
                'required' => true,
                'constraints' => [
                    new NotBlank(),
                    new Length(['min' => 2, 'max' => 20]),
                ]
            ])
            ->add('lastName', TextType::class, [
                'required' => true,
                'constraints' => [
                    new NotBlank(),
                    new Length(['min' => 2, 'max' => 20]),
                ]
            ])
            ->add('secondLastName', TextType::class, [
                'required' => true,
                'constraints' => [
                    new NotBlank(),
                    new Length(['min' => 2, 'max' => 20]),
                ]
            ])
            ->add('email', TextType::class, [
                'required' => true,
                'constraints' => [
                    new NotBlank(),
                    new CustomConstraint(),
                    new Length(['min' => 2, 'max' => 20]),
                ]
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'csrf_protection' => false,
            'allow_extra_fields' => true,
        ]);
    }

有趣的是,在我的实体中,我没有email字段,因为我使用的是Fosuserbundle。你不需要将注释放在实体中,你可以将它放在表单定义中,在约束键中的选项下,类似这样:我必须说谢谢你。现在,我的新错误验证工作了。