[英]Symfony : Validate email domain in User Form Register
我正在尝试以注册表格的形式验证用户电子邮件域。在通过FormHandler-> Class StudentRegisterHandler.php以这种方式进行验证之前
namespace AppBundle\Form\User;
use AppBundle\Form\FormHandler;
use Respect\Validation\Validator as v;
use AppBundle\Services\UserManager;
use AppBundle\Form\FormHandler;
use Respect\Validation\Validator as v;
use AppBundle\Services\UserManager;
class StudentRegisterHandler extends FormHandler {
public function handle(){
parent::handle();
if(!$this->isSubmitted()){
return;
}
$username = $this->createParamValidationResult('username');
$email = $this->createParamValidationResult('email');
$password = $this->createParamValidationResult('password');
$usernameValidator = v::allOf(
v::length(5,20),
v::regex("/^[A-Za-z0-9]+(?:[_]{0,2}[A-Za-z0-9]+)*$/")
);
$emailValidator = v::allOf(
v::email(),
v::oneOf(
v::endsWith("@yahoo.com"),
v::endsWith("@gmail.com")
)
);
return;
}
}
现在我要添加100多个电子邮件域列表(outlook.com,uad.co等),并且我不想以相同的方式进行验证,因此我创建了一个实体来存储所有这些电子邮件域。被困在寻找解决方案的方法来验证那些存储在我的Entity($ id,$ emailDomain)中的电子邮件域。 如果该电子邮件域存在于Db中,但我不知道如何为注册表单验证添加参数$ emailDomain以及如何与UserRepository.php中的方法相关联,则尝试使用存储库中的查询验证。 范例:
$emailValidator = v::allOf(
v::email(),
v::oneOf(
v::endsWith("$emailDomain")
)
);
这是我的RegistrationController.php的样子:
<?php
// src/AppBundle/Controller/RegistrationController.php
namespace AppBundle\Controller;
use AppBundle\Entity\EducatorProfile;
use AppBundle\Entity\StudentProfile;
use AppBundle\Form\User\StudentRegisterHandler;
use AppBundle\Form\User\EducatorRegisterHandler;
use AppBundle\Form\ValidationResponse;
use AppBundle\Services\UserManager;
use AppBundle\Util\TokenGenerator;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* @Route("/register")
*/
class RegistrationController extends BaseController
{
/**
* @Route("/student", name="registration_student_register")
* @param Request $request
* @param UserManager $userManager
* @param TokenGenerator $tokenGenerator
* @return Response
*/
public function studentRegisterAction(Request $request, UserManager $userManager, TokenGenerator $tokenGenerator)
{
/** @var StudentRegisterHandler $formHandler*/
$formHandler = new StudentRegisterHandler($this->container,$request);
$formHandler->handle();
/** @var ValidationResponse $validationResponse */
$validationResponse = $formHandler->getValidationResponse();
if($formHandler->isSubmitted() && $formHandler->isValid()){
$user = $userManager->createUser(
$validationResponse->getValue('username'),
$validationResponse->getValue('email'),
$validationResponse->getValue('password'),
false
);
$user->setConfirmationToken($tokenGenerator->generateToken());
$studentProfile->setUser($user);
$userManager->saveUser($user);
$userManager->saveProfile($studentProfile);
return $this->render('registration/register_student.html.twig', array(
'validationResponse' => $validationResponse
));
}
我愿意接受任何建议。谢谢
您可能可以使用参数checkMX
或checkHost
设置为true
的内置电子邮件验证器。
这是官方文档中写的基本用法:
// src/AppBundle/Entity/Author.php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\Email(
* message = "The email '{{ value }}' is not a valid email.",
* checkMX = true
* )
*/
protected $email;
}
我在下面编写的内容纯粹是理论上的,我尚未对其进行测试,但是您可以在代码中使用类似的内容:
$emailValidator = v::allOf(
v::email(['checkMX' => 'true'])
);
您是否考虑过构建自定义ValidationConstraint? ValidationConstraints是服务(基本上就像symfony中的所有内容一样)。 这意味着他们可以访问您的数据库(例如通过学说),获取所有有效域,然后相应地执行其验证。
这应该可以帮助您入门: 如何创建自定义验证约束(官方文档)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.