web-dev-qa-db-fra.com

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

Il existe un validateur d'e-mails dans symfony qui peut être utilisé sous une forme: http://symfony.com/doc/current/reference/constraints/Email.html

Ma question est: Comment puis-je utiliser ce validateur dans mon controlelr afin de valider une adresse e-mail?

Ceci est possible en utilisant le PHP preg_match pour l'utilisateur, mais ma question est de savoir s'il existe une possibilité d'utiliser le validateur d'e-mail Symfony déjà intégré.

Merci d'avance.

22
Miloš

En utilisant validateValue méthode du service 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
    // ...
}
// ...
52
Ahmed Siouani

J'ai écrit un article 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 bogue courant où vous validez contre la contrainte de messagerie 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 ça aide

15
Konrad Podgórski

Si vous créez le formulaire dans le contrôleur lui-même et que vous souhaitez valider l'e-mail dans l'action, 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 également nouveau et je l'apprends, toutes les suggestions seront appréciées ...

10
Amit Malakar

Pourquoi personne ne mentionne que vous pouvez le valider avec dans l'instance FormBuilder en utilisant la clé 'contraintes' ??? Tout d'abord, lisez la documentation tilisation d'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 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 souhaitez vérifier quelles sont les clés disponibles autres que le message, accédez à la documentation à l'adresse:

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

ou accédez à:

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

à partir de là, vous pourrez voir ce qui est disponible d'autre.

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

public $checkMX = false;

public $checkHost = false;

public $strict; "

Notez également que j'ai créé et validé un formulaire à l'intérieur du contrôleur, ce qui n'est pas une bonne pratique et ne doit être utilisé que pour des formulaires que vous ne réutiliserez jamais ailleurs dans votre application.

La meilleure pratique consiste à créer des formulaires dans un répertoire séparé sous YourBundle/Form. Déplacez tout le code vers votre nouvelle classe ContactType.php. (n'oubliez pas d'y importer la classe FormBuilder car cela n'allongera pas votre contrôleur et n'aura pas accès à cette classe via '$ this')

[dans la classe 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;

[à 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
7
DevWL

Ma solution pour symfony 3 était la suivante:

use Symfony\Component\Validator\Constraints\Email as EmailConstraint;

$email = '[email protected]';
// ... in the action then call
$emailConstraint = new EmailConstraint();

$errors = $this->get('validator')->validate(
    $email,
    $emailConstraint
);

$mailInvalid = count($errors) > 0;
1
totas