繁体   English   中英

Symfony:在用户表单注册中验证电子邮件域

[英]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
    ));
}

我愿意接受任何建议。谢谢

您可能可以使用参数checkMXcheckHost设置为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM