Php Symfony2-如何验证控制器中的电子邮件地址
symfony中有一个电子邮件验证程序,可用于以下形式: 我的问题是:如何在controlelr中使用此验证器来验证电子邮件地址 这可以通过对usere使用PHP preg_匹配实现,但我的问题是,是否有可能使用已经内置的Symfony电子邮件验证器 提前谢谢。使用服务方式Php Symfony2-如何验证控制器中的电子邮件地址,php,validation,symfony,email-validation,Php,Validation,Symfony,Email Validation,symfony中有一个电子邮件验证程序,可用于以下形式: 我的问题是:如何在controlelr中使用此验证器来验证电子邮件地址 这可以通过对usere使用PHP preg_匹配实现,但我的问题是,是否有可能使用已经内置的Symfony电子邮件验证器 提前谢谢。使用服务方式 如果您在控制器本身中创建表单,并且希望在操作中验证电子邮件,那么代码将如下所示 // add this above your class use Symfony\Component\Validator\Constraints
如果您在控制器本身中创建表单,并且希望在操作中验证电子邮件,那么代码将如下所示
// add this above your class
use Symfony\Component\Validator\Constraints\Email;
public function saveAction(Request $request)
{
$form = $this->createFormBuilder()
->add('email', 'email')
->add('siteUrl', 'url')
->getForm();
if ('POST' == $request->getMethod()) {
$form->bindRequest($request);
// the data is an *array* containing email and siteUrl
$data = $form->getData();
// do something with the data
$email = $data['email'];
$emailConstraint = new Email();
$emailConstraint->message = 'Invalid email address';
$errorList = $this->get('validator')->validateValue($email, $emailConstraint);
if (count($errorList) == 0) {
$data = array('success' => true);
} else {
$data = array('success' => false, 'error' => $errorList[0]->getMessage());
}
}
return $this->render('AcmeDemoBundle:Default:update.html.twig', array(
'form' => $form->createView()
));
}
我也是新来的,正在学习它,任何建议都将不胜感激。我写了一篇关于在表单之外验证电子邮件地址(一个或多个)的帖子 它还涵盖了一个常见的错误,您可以根据电子邮件约束进行验证,而忽略NotBlank
/**
* Validates a single email address (or an array of email addresses)
*
* @param array|string $emails
*
* @return array
*/
public function validateEmails($emails){
$errors = array();
$emails = is_array($emails) ? $emails : array($emails);
$validator = $this->container->get('validator');
$constraints = array(
new \Symfony\Component\Validator\Constraints\Email(),
new \Symfony\Component\Validator\Constraints\NotBlank()
);
foreach ($emails as $email) {
$error = $validator->validateValue($email, $constraints);
if (count($error) > 0) {
$errors[] = $error;
}
}
return $errors;
}
我希望这有帮助为什么没有人提到您可以使用“约束”键在FormBuilder实例中验证它???首先,阅读文档 与symfony 3.1配合使用效果良好 例如:
namespace SomeBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Validator\Constraints as Assert;
class DefaultController extends Controller
{
/**
* @Route("kontakt", name="_kontakt")
*/
public function userKontaktAction(Request $request) // access for all
{
$default = array('message' => 'Default input value');
$form = $this->createFormBuilder($default)
->add('name', Type\TextType::class,[
'label' => 'Nazwa firmy',
])
->add('email', Type\EmailType::class,[
'label' => 'Email',
'constraints' =>[
new Assert\Email([
'message'=>'This is not the corect email format'
]),
new Assert\NotBlank([
'message' => 'This field can not be blank'
])
],
])
->add('phone', Type\TextType::class,[
'label' => 'Telefon',
])
->add('message', Type\TextareaType::class,[
'label' => 'Wiadomość',
'attr' => [
'placeholder' => 'Napisz do nas ... '
],
])
->add('send', Type\SubmitType::class,[
'label' => 'Wyślij',
])
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
// data is an array with "name", "email", and "message" keys
$data = $form->getData();
// send email
// redirect to prevent resubmision
var_dump($data);
}
return $this->render('SomeBundle:Default:userKontakt.html.twig', [
'form' => $form->createView()
]);
}
}
结果:
请参阅有关可用验证类型的文档。
如果要检查除消息外还有哪些可用密钥,请转到文档:
或导航到:
YourProject\vendor\symfony\symfony\src\symfony\Component\Validator\Constraints\Email.php
从那里,您将能够看到还有什么可用的
还要注意的是,我在控制器内创建并验证了表单,这不是最佳实践,应该只用于表单,您永远不会在应用程序中的任何其他地方重用这些表单
最佳实践是在bundle/Form下的单独目录中创建表单。将所有代码移到新的ContactType.php类中。(不要忘记在那里导入FormBuilder类,因为它不会扩展控制器,也不会通过“$this”访问此类)
[内部ContactType类:]
namespace AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Validator\Constraints as Assert;
[控制器内部:]
use YourBundle/Form/ContactType;
// use ...
//...
$presetData = []; //... preset form data here if you want to
$this->createForm('AdminBundle\Form\FormContactType', $presetData) // instead of 'createFormBuilder'
->getForm();
// render view and pass it to twig templet...
// or send the email/save data to database and redirect the form
我对symfony 3的解决方案如下:
use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
$email = 'someinvalidmail@invalid.asdf';
// ... in the action then call
$emailConstraint = new EmailConstraint();
$errors = $this->get('validator')->validate(
$email,
$emailConstraint
);
$mailInvalid = count($errors) > 0;
另一种方法-你可以使用 它可以在没有容器的情况下使用
使用Egulias\EmailValidator\EmailValidator;
使用Egulias\EmailValidator\Validation\RFCValidation;
$validator=新的EmailValidator();
$validator->isValid(“example@example.com“,新的RFC验证());
另外,bundle还可以使用DNSCheckValidation验证DNS,请注意,validateValue在Symfony 2.5中已被弃用,应改用validate。Validator服务自2.5版起已被弃用,将在3.0中删除。Validator\RecursiveValidator应代替标题使用。如果需要默认但本地化的错误消息,则必须使用翻译服务:
foreach($errors as$error)$message=$translator->trans($error->getMessage(),[],'validators')
其中$translator的类型为TranslatorInterface
验证程序服务自2.5版起就被弃用,将在3.0中删除。应该改用Validator\RecursiveValidator谢谢,对于check MX&Host,我添加了:new Assert\Email(['checkHost'=>true,'checkMX'=>true])
namespace AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Validator\Constraints as Assert;
use YourBundle/Form/ContactType;
// use ...
//...
$presetData = []; //... preset form data here if you want to
$this->createForm('AdminBundle\Form\FormContactType', $presetData) // instead of 'createFormBuilder'
->getForm();
// render view and pass it to twig templet...
// or send the email/save data to database and redirect the form
use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
$email = 'someinvalidmail@invalid.asdf';
// ... in the action then call
$emailConstraint = new EmailConstraint();
$errors = $this->get('validator')->validate(
$email,
$emailConstraint
);
$mailInvalid = count($errors) > 0;
composer require egulias/email-validator