Intereting Posts

Symfony2 – Как проверить адрес электронной почты в контроллере

В symfony есть средство проверки подлинности электронной почты, которое можно использовать в форме: http://symfony.com/doc/current/reference/constraints/Email.html

Мой вопрос: как я могу использовать этот валидатор в моем controlelr, чтобы проверить адрес электронной почты?

Это возможно с помощью PHP preg_match для usere, но мой вопрос в том, есть ли возможность использовать Symfony, уже встроенный в средство проверки подлинности электронной почты.

Заранее спасибо.

Используя метод validateValue службы Validator

use Symfony\Component\Validator\Constraints\Email as EmailConstraint; // ... public function customAction() { $email = 'value_to_validate'; // ... $emailConstraint = new EmailConstraint(); $emailConstraint->message = 'Your customized error message'; $errors = $this->get('validator')->validateValue( $email, $emailConstraint ); // $errors is then empty if your email address is valid // it contains validation error message in case your email address is not valid // ... } // ... 

Я написал сообщение об утверждении адреса электронной почты (одного или нескольких) вне форм

http://konradpodgorski.com/blog/2013/10/29/how-to-validate-emails-outside-of-form-with-symfony-validator-component/

Он также охватывает общую ошибку, в которой вы проверяете ограничение электронной почты и забываете о 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; } 

надеюсь, это поможет

Если вы создаете форму в самом контроллере и хотите проверить электронную почту в действии, код будет выглядеть следующим образом.

 // 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() )); } 

Я также новичок и изучаю его, любые предложения будут оценены …

Почему никто не упоминает, что вы можете проверить его с помощью экземпляра FormBuilder с помощью ключа ограничений? Прежде всего, прочитайте документацию с использованием формы без класса

 'constraints' =>[ new Assert\Email([ 'message'=>'This is not the corect email format' ]), new Assert\NotBlank([ 'message' => 'This field can not be blank' ]) ], 

Прекрасно работает с 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() ]); } } 

Результат: введите описание изображения здесь

См. Документацию о доступных типах проверки. http://api.symfony.com/3.1/Symfony/Component/Validator/Constraints.html

Если вы хотите проверить, какие ключи доступны, кроме сообщений, перейдите к документации по адресу:

http://symfony.com/doc/current/reference/constraints/Email.html

или перейдите к:

YourProject \ поставщика \ Symfony \ Symfony \ SRC \ Symfony \ Component \ Validator \ Ограничения \ email.php

оттуда вы сможете увидеть, что еще доступно.

 public $message = 'This value is not a valid email address.'; public $checkMX = false; public $checkHost = false; public $strict; " 

Также обратите внимание, что я создал и проверял форму внутри контроллера, которая не является лучшей практикой и должна использоваться только для форм, которые вы никогда не будете использовать в другом месте в своем приложении.

Лучшей практикой является создание форм в разделенном каталоге в разделе «YourBundle / 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;