Symfony2 - Comment valider une adresse e-mail dans un contrôleur

Il y a un e-mail validateur dans symfony qui peut être utilisé dans un formulaire: http://symfony.com/doc/current/reference/constraints/Email.html

ma question Est: Comment puis-je utiliser ce validateur dans mon controlelr pour valider une adresse e-mail?

Ceci est possible en utilisant le preg_match de PHP pour usere, mais ma question Est s'il y a une possibilité d'utiliser le Symfony déjà construit dans Email validator.

je vous Remercie à l'avance.

20
demandé sur Miloš 2013-08-19 18:20:09

5 réponses

En utilisant validateValue méthode de l' Validateur service

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
    // ...
}
// ...
47
répondu Ahmed Siouani 2013-08-19 14:51:54

j'ai écrit un post sur la validation des adresses e-mail(une ou plusieurs) en dehors des formulaires

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

il couvre également un bug commun où vous validez contre la contrainte Email et oubliez 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;
}

j'espère que cela aide

15
répondu Konrad Podgórski 2013-10-29 14:42:55

si vous créez le formulaire dans le contrôleur lui-même et que vous voulez valider l'email dans l'action, alors le code ressemblera à ceci.

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

je suis aussi nouveau et de l'apprentissage, toutes les suggestions seront appréciées...

10
répondu Amit Malakar 2013-08-19 14:46:25

pourquoi personne ne mentionne que vous pouvez le valider dans l'instance FormBuilder en utilisant la clé' constraints'??? Tout d'abord, lisez la documentation utiliser un formulaire sans Classe

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

Fonctionne très bien avec symfony 3.1

Exemple:

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

}

Résultat: enter image description here

voir la documentation sur les types de validation disponibles. http://api.symfony.com/3.1/Symfony/Component/Validator/Constraints.html

si vous voulez vérifier quelles sont les clés disponibles autres que le message, allez à documentation à:

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

ou naviguez jusqu'à:

YourProject\vendor\symfony\symfony\src\Symfony\Component\Validator\Constraints\Email.php

à partir de là, vous aurez être en mesure de voir ce qui est disponible.

public $message = 'This value is not a valid email address.';

public $checkMX = false;

public $checkHost = false;

public $strict; "

notez aussi que j'ai créé et validé un formulaire dans le controller qui n'est pas une bonne pratique et ne devrait être utilisé que pour les formulaires que vous ne réutiliserez nulle part ailleurs dans votre application.

la meilleure pratique est de créer des formulaires dans un répertoire séparé sous YourBundle / Form. Déplacez tout le code vers votre nouveau ContactType.classe php. (n'oubliez pas d'y importer la classe FormBuilder car elle ne s'étendra pas votre contrôleur et n'auront pas accès à cette classe par '$')

[inside Contactype class:]

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;

[à l'intérieur de votre contrôleur:]

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
6
répondu DevWL 2017-10-31 17:16:34

ma solution pour symfony 3 était la suivante:

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;
1
répondu totas 2017-07-21 10:17:34