自定义表单只接受特定的电子邮件地址 FOSUserBundle 2.0/ Symfony3
custom form to accept only specific email address FOSUserBundle 2.0/ Symfony3
我尝试学习使用 Symfony 3.1.10 创建网站。为了帮助我创建 login/register 项目,我决定使用包 "FOSUserBundle 2.0"。所以现在我创建了一个自定义表单(我通过名称字段更改了用户名字段)。对于我的项目,我试图只允许注册具有特定电子邮件地址的用户。因此,经过一些研究,他们解释说要创建自定义行为,FOSUserbundle 创建了事件。因此,当我 REGISTRATION_SUCCESS 时,我会创建自定义事件侦听器,如下所示。
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");
}
}
}
我的问题是一旦我添加了一个错误,我就不知道如何在我的表单上显示它,就像捆绑包已经创建的错误一样。
提前致谢。
我不会为此使用 Event Dispatcher 组件,我将更简单地创建一个自定义验证约束。这里是 the link to the docs.
您可以创建一个约束条件来检查,例如,您的用户的电子邮件中是否有特定域。如果约束没有通过,验证就会失败,因此,注册过程,给你正确的错误信息。
文档解释得非常好,但如果您在实施方面需要帮助,请告诉我,我可以更新我的答案。
更新:
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,
]);
}
我尝试学习使用 Symfony 3.1.10 创建网站。为了帮助我创建 login/register 项目,我决定使用包 "FOSUserBundle 2.0"。所以现在我创建了一个自定义表单(我通过名称字段更改了用户名字段)。对于我的项目,我试图只允许注册具有特定电子邮件地址的用户。因此,经过一些研究,他们解释说要创建自定义行为,FOSUserbundle 创建了事件。因此,当我 REGISTRATION_SUCCESS 时,我会创建自定义事件侦听器,如下所示。
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");
}
}
}
我的问题是一旦我添加了一个错误,我就不知道如何在我的表单上显示它,就像捆绑包已经创建的错误一样。
提前致谢。
我不会为此使用 Event Dispatcher 组件,我将更简单地创建一个自定义验证约束。这里是 the link to the docs.
您可以创建一个约束条件来检查,例如,您的用户的电子邮件中是否有特定域。如果约束没有通过,验证就会失败,因此,注册过程,给你正确的错误信息。
文档解释得非常好,但如果您在实施方面需要帮助,请告诉我,我可以更新我的答案。
更新:
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,
]);
}