SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Validación
Realizada por:
Christian Aquino |@cj_aquino
Diego Ramirez |@thedarsideofit
Gonzalo Alonso |@GonzaloAlonsoD
Diego Barros |@Inmzombie
Para: Hydras C&S |@hydras_cs
Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
Validando
La validación es una tarea muy común en aplicaciones
web.
● Los datos introducidos en formularios se tienen que
validar.
● Los datos también se deben validar antes de escribirlos
en una base de datos o pasarlos a un servicio web.
Symfony2 viene con un componente Validator que facilita y
transparenta esta tarea. Este componente está basado en
la especificación de validación Bean JSR303.
Fundamentos de la validación
// src/Acme/BlogBundle/Entity/Author.php
use SymfonyComponentValidatorConstraints as Assert;
class Author
{
/**
* Restricciones
*/
public $name;
}
/**
* @AssertNotBlank()
*/
Usando el servicio validador
public function indexAction()
{
$author = new Author();
// ... hace algo con el objeto $author
$validator = $this->get('validator');
$errors = $validator->validate($author);
if (count($errors) > 0) {
return new Response(print_r($errors, true));
} else {
return new Response('The author is valid! Yes!');
}
}
Usando el servicio validador
Si la propiedad $name está vacía, verás el siguiente
mensaje de error:
AcmeBlogBundleAuthor.name:
This value should not be blank
Si insertas un valor en la propiedad $name aparecerá el
satisfactorio mensaje de éxito:
The author is valid! Yes!
Colección de errores a plantilla
if (count($errors) > 0) {
return $this->render('AcmeBlogBundle:Author:validate.
html.twig', array(
'errors' => $errors,
));
} else { // ...}
<ul>
{% for error in errors %}
<li>{{ error.message }}</li>
{% endfor %}
</ul>
Validación y formularios
public function updateAction(Request $request)
{
$author = new Author();
$form = $this->createForm(new AuthorType(), $author);
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
// validación superada, haz algo con el objeto $author
return $this->redirect($this->generateUrl(...));
}
}}
Configurando anotaciones
# app/config/config.yml
framework:
validation: { enable_annotations: true }
<!-- app/config/config.xml -->
<framework:config>
<framework:validation enable-annotations="true" />
</framework:config>
// app/config/config.php
$container->loadFromExtension('framework', array('validation' =>
array(
'enable_annotations' => true,
)));
Restricciones
A fin de validar un objeto, basta con asignar una o más
restricciones a tu clase y luego pasarla al servicio
validador.
Una restricción simplemente es un objeto PHP que hace
una declaración asertiva.
En la vida real: «El pastel no se debe quemar». En
Symfony2, son similares: son aserciones de que una
condición es verdadera.
Dado un valor, una restricción te dirá si o no el valor se
adhiere a las reglas de tu restricción.
Restricciones básicas
● NotBlank
● Blank
● NotNull
● Null
● True
● False
● Type
Restricciones de cadena
● Email
● MinLength
● MaxLength
● Length
● Url
● Regex
● Ip
Restricciones de número
● Max
● Min
● Range
Restricciones de fecha
● Date
● DateTime
● Time
Restricciones de colección
● Choice
● Collection
● Count
● UniqueEntity
● Language
● Locale
● Country
Restricciones de archivo
● File
● Image
Restricciones de financieras
● CardScheme
● Luhn
Otras restricciones
● Callback
● All
● UserPassword
● Valid
Configurando restricciones
// src/Acme/BlogBundle/Entity/Author.php
use SymfonyComponentValidatorConstraints as Assert;
class Autor
{
/**
* @AssertChoice(
* choices = { "male", "female" },
* message = "Choose a valid gender."
* )
*/
public $gender;
}
/**
* @AssertChoice({"male", "female"})
*/
Propiedades
La validación de propiedades de clase es la técnica de
validación más básica.
// Acme/BlogBundle/Entity/Author.php
use SymfonyComponentValidatorConstraints as Assert;
class Autor
{
/**
* @AssertNotBlank()
* @AssertLength(min = "3")
*/
private $firstName;
}
Captadores
Las restricciones también se pueden aplicar al valor devuelto por un método,
público que comience con get o is
// src/Acme/BlogBundle/Entity/Author.php
use SymfonyComponentValidatorConstraints as Assert;
class Author
{
/**
* @AssertTrue(message = "The password cannot match your first
name")
*/
public function isPasswordLegal()
{
// return true or false
return ($this->firstName != $this->password);
}
}
Clases - Callback
// src/Acme/BlogBundle/Entity/Author.php
namespace AcmeBlogBundleEntity;
use SymfonyComponentValidatorConstraints as Assert;
/**
* @AssertCallback(methods={"isAuthorValid"})
*/
class Author
{
}
// ...
use SymfonyComponentValidatorExecutionContext;
class Author
{
// ...
private $firstName;
public function isAuthorValid(ExecutionContext $context)
{
// de alguna manera hay un arreglo de "nombres ficticios"
$fakeNames = array();
// comprueba si el nombre en realidad es un nombre ficticio
if (in_array($this->getFirstName(), $fakeNames)) {
$context->addViolationAtSubPath('firstname', 'This name sounds totally
fake!', array(), null);
}
}
}
Validando grupos
// src/Acme/BlogBundle/Entity/User.php
namespace AcmeBlogBundleEntity;
use
SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentValidatorConstraints as Assert;
class User implements UserInterface
{
/**
* @AssertEmail(groups={"registration"})
*/
private $email;
Validando grupos
/**
* @AssertNotBlank(groups={"registration"})
* @AssertLength(min=7, groups={"registration"})
*/
private $password;
/**
* @AssertLength(min = "2")
*/
private $city;
}
Form - validando grupos
use
SymfonyComponentOptionsResolverOptionsResolverInte
rface;
public function setDefaultOptions(OptionsResolverInterface
$resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('registration')
));
}
Validando valores y arreglos
como verificar que una cadena es una dirección de correo electrónico válida
use SymfonyComponentValidatorConstraintsEmail;
// ...
public function addEmailAction($email)
{
$emailConstraint = new Email();
// puedes fijar todas las "opciones" de restricción de esta manera
$emailConstraint->message = 'Invalid email address';
// usa el validador para validar el valor
$errorList = $this->get('validator')->validateValue(
$email,
$emailConstraint
);
Validando valores y arreglos
como verificar que una cadena es una dirección de correo electrónico válida
if (count($errorList) == 0) {
// esta ES una dirección de correo válida, haz algo
} else {
// esta *no* es una dirección de correo electrónico válida
$errorMessage = $errorList[0]->getMessage();
// ... haz algo con el error
}
// ...
}
El método validateValue devuelve un objeto
SymfonyComponentValidatorConstraintViolationList, que actúa como un
arreglo de errores. Cada error de la colección es un objeto
SymfonyComponentValidatorConstraintViolation, que contiene el mensaje de
error en su método getMessage.
Crear restricciones personalizadas
Puedes crear una restricción personalizada extendiendo la
clase base “constraint”,
SymfonyComponentValidatorConstraint. A modo de
ejemplo vas a crear un sencillo validador que compruebe si
una cadena únicamente contiene caracteres
alfanuméricos.
Creando la clase de la restricción
// src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumeric.php
namespace AcmeDemoBundleValidatorConstraints;
use SymfonyComponentValidatorConstraint;
/**
* @Annotation
*/
class ContainsAlphanumeric extends Constraint
{
public $message = 'The string "%string%" contains an illegal
character: it can only contain letters or numbers.';
}
Creando el validador directamente
// src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumericValidator.php
namespace AcmeDemoBundleValidatorConstraints;
use SymfonyComponentValidatorConstraint;
use SymfonyComponentValidatorConstraintValidator;
class ContainsAlphanumericValidator extends
ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
if (!preg_match('/^[a-zA-Za0-9]+$/', $value, $matches)) {
$this->context->addViolation($constraint->message,
array('%string%' => $value));
}
}
}
// src/Acme/DemoBundle/Entity/AcmeEntity.php
use SymfonyComponentValidatorConstraints as Assert;
use AcmeDemoBundleValidatorConstraints as
AcmeAssert;
class AcmeEntity
{
/**
* @AssertNotBlank
* @AcmeAssertContainsAlphanumeric
*/
protected $name;
}
Usando el nuevo validador

Contenu connexe

Tendances

13. Configuracion De Aplicaciones Web Asp.Net
13.  Configuracion De Aplicaciones Web Asp.Net13.  Configuracion De Aplicaciones Web Asp.Net
13. Configuracion De Aplicaciones Web Asp.Net
guest3cf6ff
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web java
César Ocampo
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jquery
Eutobar
 
Un ejemplo sencillo con ejb
Un ejemplo sencillo con ejbUn ejemplo sencillo con ejb
Un ejemplo sencillo con ejb
lalov777
 

Tendances (19)

13. Configuracion De Aplicaciones Web Asp.Net
13.  Configuracion De Aplicaciones Web Asp.Net13.  Configuracion De Aplicaciones Web Asp.Net
13. Configuracion De Aplicaciones Web Asp.Net
 
Jsp servlet- Tutorial BD Conexión
Jsp servlet- Tutorial BD ConexiónJsp servlet- Tutorial BD Conexión
Jsp servlet- Tutorial BD Conexión
 
Tema3
Tema3Tema3
Tema3
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jquery
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web java
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentales
 
Ajax
AjaxAjax
Ajax
 
Tema3[php]
Tema3[php]Tema3[php]
Tema3[php]
 
Introduccion silverlight
Introduccion silverlightIntroduccion silverlight
Introduccion silverlight
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jquery
 
Java servlets
Java servletsJava servlets
Java servlets
 
Curso Java Avanzado 2 Servlets
Curso Java Avanzado   2 ServletsCurso Java Avanzado   2 Servlets
Curso Java Avanzado 2 Servlets
 
Java Primeros Pasos Revista- Edición 2
Java Primeros Pasos Revista- Edición 2Java Primeros Pasos Revista- Edición 2
Java Primeros Pasos Revista- Edición 2
 
Programación III
Programación IIIProgramación III
Programación III
 
Find File Servlet DB
Find File Servlet DBFind File Servlet DB
Find File Servlet DB
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
expo
expoexpo
expo
 
Un ejemplo sencillo con ejb
Un ejemplo sencillo con ejbUn ejemplo sencillo con ejb
Un ejemplo sencillo con ejb
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 

Similaire à Clase 10 validacion

Neo Humano - GTUG Labs (12-12-2009)
Neo Humano - GTUG Labs (12-12-2009)Neo Humano - GTUG Labs (12-12-2009)
Neo Humano - GTUG Labs (12-12-2009)
Neo Humano
 
Documentación de pruebas del software
Documentación de pruebas del softwareDocumentación de pruebas del software
Documentación de pruebas del software
Lina Vega
 
Servicio web
Servicio web Servicio web
Servicio web
Yael67
 
Framework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la redFramework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la red
Antonio Palomares Sender
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
Dani Latorre
 

Similaire à Clase 10 validacion (20)

2015 10 - Curso Cliente @firma INAP día 2
2015 10 - Curso Cliente @firma INAP día 22015 10 - Curso Cliente @firma INAP día 2
2015 10 - Curso Cliente @firma INAP día 2
 
Grails: Framework para el desarrollo de aplicaciones Web No 5
Grails: Framework para el desarrollo de aplicaciones Web No 5Grails: Framework para el desarrollo de aplicaciones Web No 5
Grails: Framework para el desarrollo de aplicaciones Web No 5
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Neo Humano - GTUG Labs (12-12-2009)
Neo Humano - GTUG Labs (12-12-2009)Neo Humano - GTUG Labs (12-12-2009)
Neo Humano - GTUG Labs (12-12-2009)
 
Enterprise Library 5
Enterprise Library 5Enterprise Library 5
Enterprise Library 5
 
Documentación de pruebas del software
Documentación de pruebas del softwareDocumentación de pruebas del software
Documentación de pruebas del software
 
Servicio web
Servicio web Servicio web
Servicio web
 
UDA-Componentes RUP. Validación
UDA-Componentes RUP. ValidaciónUDA-Componentes RUP. Validación
UDA-Componentes RUP. Validación
 
APIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptxAPIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptx
 
Seguridad
SeguridadSeguridad
Seguridad
 
Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2
 
Construyendo APIs Seguras y Escalables
Construyendo APIs Seguras y Escalables Construyendo APIs Seguras y Escalables
Construyendo APIs Seguras y Escalables
 
Framework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la redFramework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la red
 
Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2
 
Connection String Parameter Pollution
Connection String Parameter PollutionConnection String Parameter Pollution
Connection String Parameter Pollution
 
Curso Redes Linex 3
Curso Redes Linex 3Curso Redes Linex 3
Curso Redes Linex 3
 
Curso Redes Linex 3
Curso Redes Linex 3Curso Redes Linex 3
Curso Redes Linex 3
 
Backend (sf2Vigo)
Backend (sf2Vigo)Backend (sf2Vigo)
Backend (sf2Vigo)
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 
Magento 2 Módulo Low Stock Notifier
Magento 2 Módulo Low Stock NotifierMagento 2 Módulo Low Stock Notifier
Magento 2 Módulo Low Stock Notifier
 

Plus de hydras_cs (9)

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOS
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularios
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelo
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twig
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routing
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktop
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2
 

Clase 10 validacion

  • 1. Validación Realizada por: Christian Aquino |@cj_aquino Diego Ramirez |@thedarsideofit Gonzalo Alonso |@GonzaloAlonsoD Diego Barros |@Inmzombie Para: Hydras C&S |@hydras_cs Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
  • 2. Validando La validación es una tarea muy común en aplicaciones web. ● Los datos introducidos en formularios se tienen que validar. ● Los datos también se deben validar antes de escribirlos en una base de datos o pasarlos a un servicio web. Symfony2 viene con un componente Validator que facilita y transparenta esta tarea. Este componente está basado en la especificación de validación Bean JSR303.
  • 3. Fundamentos de la validación // src/Acme/BlogBundle/Entity/Author.php use SymfonyComponentValidatorConstraints as Assert; class Author { /** * Restricciones */ public $name; } /** * @AssertNotBlank() */
  • 4. Usando el servicio validador public function indexAction() { $author = new Author(); // ... hace algo con el objeto $author $validator = $this->get('validator'); $errors = $validator->validate($author); if (count($errors) > 0) { return new Response(print_r($errors, true)); } else { return new Response('The author is valid! Yes!'); } }
  • 5. Usando el servicio validador Si la propiedad $name está vacía, verás el siguiente mensaje de error: AcmeBlogBundleAuthor.name: This value should not be blank Si insertas un valor en la propiedad $name aparecerá el satisfactorio mensaje de éxito: The author is valid! Yes!
  • 6. Colección de errores a plantilla if (count($errors) > 0) { return $this->render('AcmeBlogBundle:Author:validate. html.twig', array( 'errors' => $errors, )); } else { // ...} <ul> {% for error in errors %} <li>{{ error.message }}</li> {% endfor %} </ul>
  • 7. Validación y formularios public function updateAction(Request $request) { $author = new Author(); $form = $this->createForm(new AuthorType(), $author); if ($request->isMethod('POST')) { $form->bind($request); if ($form->isValid()) { // validación superada, haz algo con el objeto $author return $this->redirect($this->generateUrl(...)); } }}
  • 8. Configurando anotaciones # app/config/config.yml framework: validation: { enable_annotations: true } <!-- app/config/config.xml --> <framework:config> <framework:validation enable-annotations="true" /> </framework:config> // app/config/config.php $container->loadFromExtension('framework', array('validation' => array( 'enable_annotations' => true, )));
  • 9. Restricciones A fin de validar un objeto, basta con asignar una o más restricciones a tu clase y luego pasarla al servicio validador. Una restricción simplemente es un objeto PHP que hace una declaración asertiva. En la vida real: «El pastel no se debe quemar». En Symfony2, son similares: son aserciones de que una condición es verdadera. Dado un valor, una restricción te dirá si o no el valor se adhiere a las reglas de tu restricción.
  • 10. Restricciones básicas ● NotBlank ● Blank ● NotNull ● Null ● True ● False ● Type
  • 11. Restricciones de cadena ● Email ● MinLength ● MaxLength ● Length ● Url ● Regex ● Ip
  • 12. Restricciones de número ● Max ● Min ● Range Restricciones de fecha ● Date ● DateTime ● Time
  • 13. Restricciones de colección ● Choice ● Collection ● Count ● UniqueEntity ● Language ● Locale ● Country Restricciones de archivo ● File ● Image
  • 14. Restricciones de financieras ● CardScheme ● Luhn Otras restricciones ● Callback ● All ● UserPassword ● Valid
  • 15. Configurando restricciones // src/Acme/BlogBundle/Entity/Author.php use SymfonyComponentValidatorConstraints as Assert; class Autor { /** * @AssertChoice( * choices = { "male", "female" }, * message = "Choose a valid gender." * ) */ public $gender; } /** * @AssertChoice({"male", "female"}) */
  • 16. Propiedades La validación de propiedades de clase es la técnica de validación más básica. // Acme/BlogBundle/Entity/Author.php use SymfonyComponentValidatorConstraints as Assert; class Autor { /** * @AssertNotBlank() * @AssertLength(min = "3") */ private $firstName; }
  • 17. Captadores Las restricciones también se pueden aplicar al valor devuelto por un método, público que comience con get o is // src/Acme/BlogBundle/Entity/Author.php use SymfonyComponentValidatorConstraints as Assert; class Author { /** * @AssertTrue(message = "The password cannot match your first name") */ public function isPasswordLegal() { // return true or false return ($this->firstName != $this->password); } }
  • 18. Clases - Callback // src/Acme/BlogBundle/Entity/Author.php namespace AcmeBlogBundleEntity; use SymfonyComponentValidatorConstraints as Assert; /** * @AssertCallback(methods={"isAuthorValid"}) */ class Author { }
  • 19. // ... use SymfonyComponentValidatorExecutionContext; class Author { // ... private $firstName; public function isAuthorValid(ExecutionContext $context) { // de alguna manera hay un arreglo de "nombres ficticios" $fakeNames = array(); // comprueba si el nombre en realidad es un nombre ficticio if (in_array($this->getFirstName(), $fakeNames)) { $context->addViolationAtSubPath('firstname', 'This name sounds totally fake!', array(), null); } } }
  • 20. Validando grupos // src/Acme/BlogBundle/Entity/User.php namespace AcmeBlogBundleEntity; use SymfonyComponentSecurityCoreUserUserInterface; use SymfonyComponentValidatorConstraints as Assert; class User implements UserInterface { /** * @AssertEmail(groups={"registration"}) */ private $email;
  • 21. Validando grupos /** * @AssertNotBlank(groups={"registration"}) * @AssertLength(min=7, groups={"registration"}) */ private $password; /** * @AssertLength(min = "2") */ private $city; }
  • 22. Form - validando grupos use SymfonyComponentOptionsResolverOptionsResolverInte rface; public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'validation_groups' => array('registration') )); }
  • 23. Validando valores y arreglos como verificar que una cadena es una dirección de correo electrónico válida use SymfonyComponentValidatorConstraintsEmail; // ... public function addEmailAction($email) { $emailConstraint = new Email(); // puedes fijar todas las "opciones" de restricción de esta manera $emailConstraint->message = 'Invalid email address'; // usa el validador para validar el valor $errorList = $this->get('validator')->validateValue( $email, $emailConstraint );
  • 24. Validando valores y arreglos como verificar que una cadena es una dirección de correo electrónico válida if (count($errorList) == 0) { // esta ES una dirección de correo válida, haz algo } else { // esta *no* es una dirección de correo electrónico válida $errorMessage = $errorList[0]->getMessage(); // ... haz algo con el error } // ... } El método validateValue devuelve un objeto SymfonyComponentValidatorConstraintViolationList, que actúa como un arreglo de errores. Cada error de la colección es un objeto SymfonyComponentValidatorConstraintViolation, que contiene el mensaje de error en su método getMessage.
  • 25. Crear restricciones personalizadas Puedes crear una restricción personalizada extendiendo la clase base “constraint”, SymfonyComponentValidatorConstraint. A modo de ejemplo vas a crear un sencillo validador que compruebe si una cadena únicamente contiene caracteres alfanuméricos.
  • 26. Creando la clase de la restricción // src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumeric.php namespace AcmeDemoBundleValidatorConstraints; use SymfonyComponentValidatorConstraint; /** * @Annotation */ class ContainsAlphanumeric extends Constraint { public $message = 'The string "%string%" contains an illegal character: it can only contain letters or numbers.'; }
  • 27. Creando el validador directamente // src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumericValidator.php namespace AcmeDemoBundleValidatorConstraints; use SymfonyComponentValidatorConstraint; use SymfonyComponentValidatorConstraintValidator; class ContainsAlphanumericValidator extends ConstraintValidator { public function validate($value, Constraint $constraint) { if (!preg_match('/^[a-zA-Za0-9]+$/', $value, $matches)) { $this->context->addViolation($constraint->message, array('%string%' => $value)); } } }
  • 28. // src/Acme/DemoBundle/Entity/AcmeEntity.php use SymfonyComponentValidatorConstraints as Assert; use AcmeDemoBundleValidatorConstraints as AcmeAssert; class AcmeEntity { /** * @AssertNotBlank * @AcmeAssertContainsAlphanumeric */ protected $name; } Usando el nuevo validador