clase 10 validacion
DESCRIPTION
www.hydrascs.comTRANSCRIPT
![Page 1: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/1.jpg)
Validación
Realizada por:Christian Aquino |@cj_aquinoDiego Ramirez |@thedarsideofitGonzalo Alonso |@GonzaloAlonsoDDiego Barros |@Inmzombie
Para: Hydras C&S |@hydras_csBasada en Libro Symfony 2 en español Nacho Pacheco y The Book
![Page 2: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/2.jpg)
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.
![Page 3: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/3.jpg)
Fundamentos de la validación// src/Acme/BlogBundle/Entity/Author.phpuse Symfony\Component\Validator\Constraints as Assert;
class Author{ /** * Restricciones */ public $name;}
/** * @Assert\NotBlank() */
![Page 4: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/4.jpg)
Usando el servicio validadorpublic 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!'); }}
![Page 5: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/5.jpg)
Usando el servicio validadorSi la propiedad $name está vacía, verás el siguiente
mensaje de error:
Acme\BlogBundle\Author.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!
![Page 6: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/6.jpg)
Colección de errores a plantillaif (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>
![Page 7: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/7.jpg)
Validación y formulariospublic 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(...)); } }}
![Page 8: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/8.jpg)
Configurando anotaciones# app/config/config.ymlframework: 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,)));
![Page 9: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/9.jpg)
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.
![Page 10: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/10.jpg)
Restricciones básicas
● NotBlank● Blank● NotNull● Null● True● False● Type
![Page 11: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/11.jpg)
Restricciones de cadena
● Email● MinLength● MaxLength● Length● Url● Regex● Ip
![Page 12: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/12.jpg)
Restricciones de número● Max● Min● Range
Restricciones de fecha● Date● DateTime● Time
![Page 13: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/13.jpg)
Restricciones de colección● Choice● Collection● Count● UniqueEntity● Language● Locale● Country
Restricciones de archivo● File● Image
![Page 14: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/14.jpg)
Restricciones de financieras● CardScheme● Luhn
Otras restricciones● Callback● All● UserPassword● Valid
![Page 15: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/15.jpg)
Configurando restricciones// src/Acme/BlogBundle/Entity/Author.phpuse Symfony\Component\Validator\Constraints as Assert;
class Autor{ /** * @Assert\Choice( * choices = { "male", "female" }, * message = "Choose a valid gender." * ) */ public $gender;}
/** * @Assert\Choice({"male", "female"}) */
![Page 16: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/16.jpg)
PropiedadesLa validación de propiedades de clase es la técnica de validación más básica.
// Acme/BlogBundle/Entity/Author.phpuse Symfony\Component\Validator\Constraints as Assert;
class Autor{ /** * @Assert\NotBlank() * @Assert\Length(min = "3") */ private $firstName;}
![Page 17: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/17.jpg)
CaptadoresLas 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.phpuse Symfony\Component\Validator\Constraints as Assert;
class Author{ /** * @Assert\True(message = "The password cannot match your first name") */ public function isPasswordLegal() {
// return true or falsereturn ($this->firstName != $this->password);
}}
![Page 18: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/18.jpg)
Clases - Callback
// src/Acme/BlogBundle/Entity/Author.phpnamespace Acme\BlogBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
/** * @Assert\Callback(methods={"isAuthorValid"}) */class Author{}
![Page 19: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/19.jpg)
// ...use Symfony\Component\Validator\ExecutionContext;
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); } }}
![Page 20: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/20.jpg)
Validando grupos// src/Acme/BlogBundle/Entity/User.phpnamespace Acme\BlogBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;use Symfony\Component\Validator\Constraints as Assert;
class User implements UserInterface{ /** * @Assert\Email(groups={"registration"}) */ private $email;
![Page 21: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/21.jpg)
Validando grupos
/** * @Assert\NotBlank(groups={"registration"}) * @Assert\Length(min=7, groups={"registration"}) */ private $password;
/** * @Assert\Length(min = "2") */ private $city;}
![Page 22: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/22.jpg)
Form - validando grupos
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
public function setDefaultOptions(OptionsResolverInterface $resolver){ $resolver->setDefaults(array( 'validation_groups' => array('registration') ));}
![Page 23: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/23.jpg)
Validando valores y arregloscomo verificar que una cadena es una dirección de correo electrónico válida
use Symfony\Component\Validator\Constraints\Email;// ...
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 );
![Page 24: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/24.jpg)
Validando valores y arregloscomo 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 Symfony\Component\Validator\ConstraintViolationList, que actúa como un arreglo de errores. Cada error de la colección es un objeto Symfony\Component\Validator\ConstraintViolation, que contiene el mensaje de error en su método getMessage.
![Page 25: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/25.jpg)
Crear restricciones personalizadas
Puedes crear una restricción personalizada extendiendo la clase base “constraint”,
Symfony\Component\Validator\Constraint. A modo de ejemplo vas a crear un sencillo validador que compruebe si
una cadena únicamente contiene caracteres alfanuméricos.
![Page 26: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/26.jpg)
Creando la clase de la restricción// src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumeric.phpnamespace Acme\DemoBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/** * @Annotation */class ContainsAlphanumeric extends Constraint{ public $message = 'The string "%string%" contains an illegal character: it can only contain letters or numbers.';}
![Page 27: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/27.jpg)
Creando el validador directamente// src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumericValidator.phpnamespace Acme\DemoBundle\Validator\Constraints;use Symfony\Component\Validator\Constraint;use Symfony\Component\Validator\ConstraintValidator;
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)); } }}
![Page 28: Clase 10 validacion](https://reader036.vdocumento.com/reader036/viewer/2022081505/55660f98d8b42a06318b4b63/html5/thumbnails/28.jpg)
// src/Acme/DemoBundle/Entity/AcmeEntity.phpuse Symfony\Component\Validator\Constraints as Assert;use Acme\DemoBundle\Validator\Constraints as AcmeAssert;
class AcmeEntity{ /** * @Assert\NotBlank * @AcmeAssert\ContainsAlphanumeric */ protected $name;}
Usando el nuevo validador