В 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 // ... } // ...
Я написал сообщение об утверждении адреса электронной почты (одного или нескольких) вне форм
Он также охватывает общую ошибку, в которой вы проверяете ограничение электронной почты и забываете о 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;