В Symfony2 - Как проверить адрес электронной почты в контроллере
в symfony есть валидатор электронной почты, который можно использовать в форме:http://symfony.com/doc/current/reference/constraints/Email.html
мой вопрос: Как я могу использовать этот валидатор в моем controlelr для проверки адреса электронной почты?
Это возможно с помощью PHP preg_match для usere, но мой вопрос в том, есть ли возможность использовать Symfony, уже встроенный в Email validator.
заранее спасибо.
5 ответов
С помощью validateValue метод валидатор сервис
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()
        ]);
    }
}
см. documentaion о доступных типах проверки. http://api.symfony.com/3.1/Symfony/Component/Validator/Constraints.html
если вы хотите проверить, какие ключи доступны, кроме сообщения, перейдите к документации по адресу:
http://symfony.com/doc/current/reference/constraints/Email.html
или перейдите по ссылке:
Ваш_проект\поставщика\в Symfony\Symfony с\НИЦ\в Symfony\компонент\проверки\ограничения\электронной почте.в PHP
оттуда, вы быть в состоянии увидеть, что еще доступно.
public $message = 'This value is not a valid email address.'; public $checkMX = false; public $checkHost = false; public $strict; "
также обратите внимание, что я создал и проверил форму внутри контроллера, которая не является лучшей практикой и должна использоваться только для форм, которые вы никогда не будете повторно использовать нигде в своем приложении.
рекомендуется создавать формы в отдельном каталоге под YourBundle / Form. Переместите весь код на новый тип контакта.класс 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;
            