我已经在我的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');
}
提前致谢!
答案 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
}
}