如何在Symfony 3.x中验证控制器中的电子邮件地址
我已经在我的Symfony项目中集成了FOSUserBundle和HWIOAUTHBundle。我在FOSUserBundle的简单登录表单旁边有一个facebook和一个google登录/注册。然而,Facebook不一定会给我回电子邮件,因为Facebook帐户不需要它(即当用户通过电话在Facebook上注册时)。在这种情况下,当用户注册时,我将她/他的电子邮件地址设置为与facebook/google ID相同(因为我不能将电子邮件字段留空) 当我的网站上有人订购物品时,我需要给他发送一封包含二维码的电子邮件,她/他将使用二维码来验证自己,因此我需要一种从用户那里获取真实电子邮件地址的方法 我认为,当用户通过Facebook注册并尝试购买产品时,我会将其重定向到个人资料编辑页面,显示一个通知,告知他/她应该提供正确的电子邮件地址,然后她/他可以继续购买 但是,我需要验证他们当前的电子邮件是否是处理购买的控制器中的真实(或至少看起来真实)电子邮件地址 如何在控制器中使用Symfony的验证器来检查用户的电子邮件是否来自如何在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相同(因为我不能将电子邮件字段留空) 当我的网站上有人订购物品时,我需要给他发送一
$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
);