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.
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
// ...
}
// ...
j'ai écrit un post sur la validation des adresses e-mail(une ou plusieurs) en dehors des formulaires
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
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...
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()
]);
}
}
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
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;