如何在Symfony 3.x中验证控制器中的电子邮件地址

如何在Symfony 3.x中验证控制器中的电子邮件地址,symfony,validation,email,symfony3.x,Symfony,Validation,Email,Symfony3.x,我已经在我的Symfony项目中集成了FOSUserBundle和HWIOAUTHBundle。我在FOSUserBundle的简单登录表单旁边有一个facebook和一个google登录/注册。然而,Facebook不一定会给我回电子邮件,因为Facebook帐户不需要它(即当用户通过电话在Facebook上注册时)。在这种情况下,当用户注册时,我将她/他的电子邮件地址设置为与facebook/google ID相同(因为我不能将电子邮件字段留空) 当我的网站上有人订购物品时,我需要给他发送一

我已经在我的Symfony项目中集成了FOSUserBundle和HWIOAUTHBundle。我在FOSUserBundle的简单登录表单旁边有一个facebook和一个google登录/注册。然而,Facebook不一定会给我回电子邮件,因为Facebook帐户不需要它(即当用户通过电话在Facebook上注册时)。在这种情况下,当用户注册时,我将她/他的电子邮件地址设置为与facebook/google ID相同(因为我不能将电子邮件字段留空)

当我的网站上有人订购物品时,我需要给他发送一封包含二维码的电子邮件,她/他将使用二维码来验证自己,因此我需要一种从用户那里获取真实电子邮件地址的方法

我认为,当用户通过Facebook注册并尝试购买产品时,我会将其重定向到个人资料编辑页面,显示一个通知,告知他/她应该提供正确的电子邮件地址,然后她/他可以继续购买

但是,我需要验证他们当前的电子邮件是否是处理购买的控制器中的真实(或至少看起来真实)电子邮件地址

如何在控制器中使用Symfony的验证器来检查用户的电子邮件是否来自
$user=$this->get('security.token_storage')->getToken()->getUser()$用户->获取电子邮件()看起来真的像电子邮件吗

现在,这就是我所拥有的:

if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
    throw $this->createAccessDeniedException('some message');
}

$user = $this->get('security.token_storage')->getToken()->getUser();

if ($user->isEnabled() == false) {
    throw $this->createAccessDeniedException('some message');
}

if (null == $user->getEmail() || $user->getFacebookId() == $user->getEmail() || $user->getGoogleId() === $user->getEmail()) {
    $session = new Session();
    $session->getFlashBag()->add('warning', 'Please provide a real email address, yata yata, etc.');
    return $this->redirectToRoute('fos_user_profile_edit');
}

提前谢谢

您应该能够只使用
验证程序
服务,并向其提供值和约束(或组合约束列表)

这个简单的示例应该可以使用(对于SF3.3+,根据您的服务定义策略,您可能必须通过构造函数注入它)


在你的控制器里试试这个

    ...
use Symfony\Component\Validator\Validator\ValidatorInterface;

// ...
public function addEmailAction($email, ValidatorInterface $validator)
{
    $emailConstraint = new Assert\Email();
    // all constraint "options" can be set this way
    $emailConstraint->message = 'Invalid email address';

    // use the validator to validate the value
    $errorList = $validator->validate(
        $email,
        $emailConstraint
    );

请参阅此处的文档

如果要确保DNS存在并且MX服务器正在其下运行(接收电子邮件所必需的),则应在Symfony电子邮件断言上激活
checkMX
checkHost
。这样你就可以接受电子邮件:)麦克斯基的回答完全正确。您只需要知道,激活CheckMX和CheckHost可能会提高一点性能。但没那么多。在这里检查checkMX和checHost的文档。激活这些选项不会提高性能,这会降低性能,因为应用程序将执行一些检查域和mx的调用。但是,如果你想要的不仅仅是检查电子邮件字符串,并确保电子邮件是“真实的”,你必须这样做。检查
供应商/symfony/symfony/src/symfony/Component/Validator/Constraints/EmailValidator.php
class@Mcsky是的,这就是我的意思,但对我的“糟糕”英语,我写的是“改进”而不是“减少”,我认为动词“改进”的意思是“减少”。谢谢你的评论。@Mz1907非常感谢,我不知道我怎么会错过:)也谢谢Mcsky我不知道,它看起来真的是一个很棒的功能,尽管我需要先测试一下:)
    ...
use Symfony\Component\Validator\Validator\ValidatorInterface;

// ...
public function addEmailAction($email, ValidatorInterface $validator)
{
    $emailConstraint = new Assert\Email();
    // all constraint "options" can be set this way
    $emailConstraint->message = 'Invalid email address';

    // use the validator to validate the value
    $errorList = $validator->validate(
        $email,
        $emailConstraint
    );