clase 10 validacion

28
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

Upload: hydrascs

Post on 28-May-2015

264 views

Category:

Documents


0 download

DESCRIPTION

www.hydrascs.com

TRANSCRIPT

Page 1: Clase 10   validacion

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

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

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

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

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

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

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

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

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

Restricciones básicas

● NotBlank● Blank● NotNull● Null● True● False● Type

Page 11: Clase 10   validacion

Restricciones de cadena

● Email● MinLength● MaxLength● Length● Url● Regex● Ip

Page 12: Clase 10   validacion

Restricciones de número● Max● Min● Range

Restricciones de fecha● Date● DateTime● Time

Page 13: Clase 10   validacion

Restricciones de colección● Choice● Collection● Count● UniqueEntity● Language● Locale● Country

Restricciones de archivo● File● Image

Page 14: Clase 10   validacion

Restricciones de financieras● CardScheme● Luhn

Otras restricciones● Callback● All● UserPassword● Valid

Page 15: Clase 10   validacion

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

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

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

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

// ...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

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

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

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

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

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

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

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

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

// 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