php - validator - symfony validation
Symfony2-Cómo validar una dirección de correo electrónico en un controlador (5)
Hay un validador de correo electrónico en Symfony que se puede usar de forma: http://symfony.com/doc/current/reference/constraints/Email.html
Mi pregunta es: ¿Cómo puedo usar este validador en mi controlelr para validar una dirección de correo electrónico?
Esto es posible mediante el uso de PHP preg_match para usere, pero mi pregunta es si existe la posibilidad de usar el validador de correo electrónico Symfony ya incorporado.
Gracias de antemano.
¿Por qué nadie menciona que puede validarlo con la instancia de FormBuilder usando la clave ''restricciones''? En primer lugar, lea la documentación Cómo usar un formulario sin clase
''constraints'' =>[
new Assert/Email([
''message''=>''This is not the corect email format''
]),
new Assert/NotBlank([
''message'' => ''This field can not be blank''
])
],
Funciona bien con Symfony 3.1
Ejemplo:
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()
]);
}
}
Consulte la documentación sobre los tipos de validación disponibles. http://api.symfony.com/3.1/Symfony/Component/Validator/Constraints.html
Si desea verificar cuáles son las claves disponibles además del mensaje, vaya a la documentación en:
http://symfony.com/doc/current/reference/constraints/Email.html
o navegue a:
YourProject / vendor / symfony / symfony / src / Symfony / Component / Validator / Restricciones / Email.php
A partir de ahí, podrás ver qué más hay disponible.
public $message = ''This value is not a valid email address.''; public $checkMX = false; public $checkHost = false; public $strict; "
También tenga en cuenta que creé y validé un formulario dentro del controlador, lo cual no es una buena práctica y solo se debe utilizar para formularios, que nunca volverá a utilizar en su aplicación.
La mejor práctica es crear formularios en un directorio separado debajo de YourBundle / Form. Mueve todo el código a tu nueva clase ContactType.php. (No olvide importar la clase FormBuilder allí ya que no extenderá su controlador y no tendrá acceso a esta clase a través de ''$ this'')
[dentro de la clase 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;
[dentro de su controlador:]
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
Escribí una publicación sobre la validación de las direcciones de correo electrónico (una o varias) fuera de los formularios
También cubre un error común en el que se valida contra Restricción de correo electrónico y se olvida de 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;
}
espero que esto ayude
Mi solución para Symfony 3 fue la siguiente:
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;
Si está creando el formulario en el propio controlador y desea validar el correo electrónico en la acción, entonces el código se verá así.
// 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()
));
}
También soy nuevo y lo estoy aprendiendo, cualquier sugerencia será apreciada ...
Utilizando el método validateValue del servicio 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
// ...
}
// ...