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

时间:2017-11-09 09:30:43

标签: symfony validation email symfony3.x

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

当我网站上有人订购某件商品时,我需要向他发送一封电子邮件,其中包含用于验证自己身份的QR码,因此我需要一种方法从用户那里获取真实的电子邮件地址。

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

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

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

现在这就是我所拥有的:

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');
}

提前致谢!

2 个答案:

答案 0 :(得分:2)

在你的控制器中试试这个

    ...
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
    );

请参阅此处的文档https://symfony.com/doc/current/validation/raw_values.html

答案 1 :(得分:0)

您应该能够使用validator服务并使用值和约束(或组合约束列表)来提供它

这个简单的例子应该有效(对于sf 3.3+,取决于你可能必须通过构造函数注入它的服务定义策略)

public function testAction()
{
    $constraint = new \Symfony\Component\Validator\Constraints\Email();
    $stringToTest = 'lorem@ipsum.com';

    $errors = $this->get('validator')->validate($stringToTest, $constraint);

    if(count($errors) > 0) {
        //no valid email
    }
}