Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2-如何验证控制器中的电子邮件地址_Php_Validation_Symfony_Email Validation - Fatal编程技术网

Php Symfony2-如何验证控制器中的电子邮件地址

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

symfony中有一个电子邮件验证程序,可用于以下形式:

我的问题是:如何在controlelr中使用此验证器来验证电子邮件地址

这可以通过对usere使用PHP preg_匹配实现,但我的问题是,是否有可能使用已经内置的Symfony电子邮件验证器

提前谢谢。

使用服务方式


如果您在控制器本身中创建表单,并且希望在操作中验证电子邮件,那么代码将如下所示

// 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