Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Domine Validação de Dados em 45min

Domine Validação de Dados em 45min

63c59020e0d7efaef816653c853ecc05?s=128

Alexandre Gaigalas

March 11, 2013
Tweet

More Decks by Alexandre Gaigalas

Other Decks in Technology

Transcript

  1. 30 de Novembro PHP Conference 2012 1 Domine Validação de

    Dados em 45min
  2. 30 de Novembro PHP Conference 2012 2 Alexandre Gaigalas http://about.me/alganet

  3. 30 de Novembro PHP Conference 2012 3 @alganet

  4. 30 de Novembro PHP Conference 2012 4 @alganet Alfanumérico

  5. 30 de Novembro PHP Conference 2012 5 @alganet Alfanumérico Aceita

    _
  6. 30 de Novembro PHP Conference 2012 6 @alganet Alfanumérico Aceita

    _ Sem espaços
  7. 30 de Novembro PHP Conference 2012 7 @alganet Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços
  8. 30 de Novembro PHP Conference 2012 8 @alganet Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços /^[[:alnum:]_]{1,15}$/ (Expressão Regular)
  9. 30 de Novembro PHP Conference 2012 9 @alexandre_gomes_gaigalas Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços /^[[:alnum:]_]{1,15}$/
  10. 30 de Novembro PHP Conference 2012 10 @al-ga-net Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços /^[[:alnum:]_]{1,15}$/
  11. 30 de Novembro PHP Conference 2012 11 @Alexandre Gomes Alfanumérico

    Aceita _ 1-15 caracteres Sem espaços /^[[:alnum:]_]{1,15}$/
  12. 30 de Novembro PHP Conference 2012 12 E se eu

    quiser exibir os erros?
  13. 30 de Novembro PHP Conference 2012 13 @alganet Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços if (!ctype_alnum(str_replace('_', '', $username))) echo “Username pode conter apenas letras, números e _”;
  14. 30 de Novembro PHP Conference 2012 14 @alganet Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços if (!ctype_alnum(str_replace('_', '', $username))) echo “Username pode conter apenas letras, números e _”; if (strlen($username) < 1 || strlen($username) > 15) echo “Username pode conter de 1 a 15 caracteres”;
  15. 30 de Novembro PHP Conference 2012 15 @alganet Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços $e = array(); if (!ctype_alnum(str_replace('_', '', $username))) $e[] = “Username pode conter apenas letras, números e _”; if (strlen($username) < 1 || strlen($username) > 15) $e[] = “Username pode conter de 1 a 15 caracteres”; if ($e) echo implode($e);
  16. 30 de Novembro PHP Conference 2012 16 E o erro

    para o “Sem espaços”?
  17. 30 de Novembro PHP Conference 2012 17 @alganet Alfanumérico Aceita

    _ 1-15 caracteres Sem espaços $e = array(); if (!ctype_alnum(str_replace('_', '', $username))) $e[] = “Username pode conter apenas letras, números e _”; if (strlen($username) < 1 || strlen($username) > 15) $e[] = “Username pode conter de 1 a 15 caracteres”; if (false !== strpos($username, “ ”) $e[] = “Username não pode conter espaços”; /*...*/
  18. 30 de Novembro PHP Conference 2012 18 Validation

  19. 30 de Novembro PHP Conference 2012 19 use Respect\Validation\Rules as

    r; $validator = new r\AllOf( ); Construindo um Validator
  20. 30 de Novembro PHP Conference 2012 20 use Respect\Validation\Rules as

    r; $validator = new r\AllOf( new r\Alnum(“_”) ); Construindo um Validator
  21. 30 de Novembro PHP Conference 2012 21 use Respect\Validation\Rules as

    r; $validator = new r\AllOf( new r\Alnum(“_”), new r\NoWhitespace ); Construindo um Validator
  22. 30 de Novembro PHP Conference 2012 22 use Respect\Validation\Rules as

    r; $validator = new r\AllOf( new r\Alnum(“_”), new r\NoWhitespace, new r\Length(1, 15) ); Construindo um Validator
  23. 30 de Novembro PHP Conference 2012 23 use Respect\Validation\Rules as

    r; $validator = new r\AllOf( new r\Alnum(“_”), new r\NoWhitespace, new r\Length(1, 15) ); $isOk = $validator->validate(“alganet”); Construindo um Validator
  24. 30 de Novembro PHP Conference 2012 24 Tem um jeito

    mais simples?
  25. 30 de Novembro PHP Conference 2012 25 use Respect\Validation\Validator as

    v; $validator = v::alnum('_') ->noWhitespace() ->length(1, 15); $isOk = $validator->validate(“alganet”); Construção via Fluent Builder
  26. 30 de Novembro PHP Conference 2012 26 //true or false

    $validator->validate($algo);
  27. 30 de Novembro PHP Conference 2012 27 E se eu

    quiser coletar os erros?
  28. 30 de Novembro PHP Conference 2012 28 try { $validator->check(“e

    ae”); } catch (InvalidArgumentException $e) { echo $e->getMessage(); }
  29. 30 de Novembro PHP Conference 2012 29 use Respect\Validation\Exceptions as

    e; /* … */ try { $validator->check(“e ae”); } catch (e\AlnumException $e) { //faz algo } catch (e\NoWhitespaceException $e) { //faz algo } catch (e\LengthException $e) { //faz algo }
  30. 30 de Novembro PHP Conference 2012 30 //Dispara exception para

    o primeiro //erro $validator->check($algo);
  31. 30 de Novembro PHP Conference 2012 31 E se eu

    quiser todos os erros?
  32. 30 de Novembro PHP Conference 2012 32 try { $validator->assert(“e

    ae”); } catch (InvalidArgumentException $e) { echo $e->getFullMessage(); }
  33. 30 de Novembro PHP Conference 2012 33 \-All of the

    3 required rules must pass |-"td errado#" must contain only letters (a-z) | and digits (0-9) |-"td errado#" must not contain whitespace \-"td errado#" must have a length between 1 and 15 $validator->assert(“td errado#”);
  34. 30 de Novembro PHP Conference 2012 34 E se eu

    quiser agrupar só alguns erros?
  35. 30 de Novembro PHP Conference 2012 35 try { $validator->assert(“e

    ae”); } catch (InvalidArgumentException $e) { $e->findMessages(array( 'alnum', 'length' )); }
  36. 30 de Novembro PHP Conference 2012 36 E se eu

    quiser mensagens diferentes?
  37. 30 de Novembro PHP Conference 2012 37 try { $validator->assert(“e

    ae”); } catch (InvalidArgumentException $e) { $e->findMessages(array( 'alnum' => “{{name}} Inválido”, 'length' => “Tamanho de {{name}} incorreto” )); }
  38. 30 de Novembro PHP Conference 2012 38 //Dispara exception com

    todos os erros $validator->assert($algo);
  39. 30 de Novembro PHP Conference 2012 39 E se eu

    quiser validar objetos inteiros?
  40. 30 de Novembro PHP Conference 2012 40 class Tweet {

    public $text; public $created_at; public $user; } class User { public $name; }
  41. 30 de Novembro PHP Conference 2012 41 $user = new

    User; $user->name = 'alganet'; $tweet = new Tweet; $tweet->user = $user; $tweet->text = “http://respect.li”; $tweet->created_at = new DateTime;
  42. 30 de Novembro PHP Conference 2012 42 $tweetValidator = v::object()

    ->instance(“Tweet”) ->attribute(“text”, v::string()->length(1, 140)) ->attribute(“created_at”, v::date()) ->attribute(“user”, v::object() ->instance(“User”) ->attribute(“name”, $usernameValidator)) );
  43. 30 de Novembro PHP Conference 2012 43 $tweetValidator = v::object()

    ->instance(“Tweet”) ->attribute(“text”, v::string()->length(1, 140)) ->attribute(“created_at”, v::date()) ->attribute(“user”, v::object() ->instance(“User”) ->attribute(“name”, $usernameValidator)) );
  44. 30 de Novembro PHP Conference 2012 44 $tweetValidator = v::object()

    ->instance(“Tweet”) ->attribute(“text”, v::string()->length(1, 140)) ->attribute(“created_at”, v::date()) ->attribute(“user”, v::object() ->instance(“User”) ->attribute(“name”, $usernameValidator)) );
  45. 30 de Novembro PHP Conference 2012 45 $tweetValidator = v::object()

    ->instance(“Tweet”) ->attribute(“text”, v::string()->length(1, 140)) ->attribute(“created_at”, v::date()) ->attribute(“user”, v::object() ->instance(“User”) ->attribute(“name”, $usernameValidator)) );
  46. 30 de Novembro PHP Conference 2012 46 $tweetValidator = v::object()

    ->instance(“Tweet”) ->attribute(“text”, v::string()->length(1, 140)) ->attribute(“created_at”, v::date()) ->attribute(“user”, v::object() ->instance(“User”) ->attribute(“name”, $usernameValidator)) );
  47. 30 de Novembro PHP Conference 2012 47 //Valida atributos de

    objetos v::object()->attribute(“name”); //Valida chaves de array v::arr()->key(“email”);
  48. 30 de Novembro PHP Conference 2012 48 //Valida atributos de

    objetos v::object()->attribute(“name”) //N atributos... ->attribute(“sex”); //Valida chaves de array v::arr()->key(“email”) ->key(“sex”);
  49. 30 de Novembro PHP Conference 2012 49 //Valida atributos de

    objetos v::object()->attribute(“name”) //N atributos... ->attribute(“sex”, //Valida o valor também v::in('F', 'M')); //Valida chaves de array v::arr()->key(“email”) ->key(“sex”, v::in('F', 'M'));
  50. 30 de Novembro PHP Conference 2012 50 E se eu

    quiser negar uma regra?
  51. 30 de Novembro PHP Conference 2012 51 //Nega qualquer regra

    v::not(v::string());
  52. 30 de Novembro PHP Conference 2012 52 E as mensagens

    pra regras negadas?
  53. 30 de Novembro PHP Conference 2012 53 //”123” must be

    a string v::string()->check(123); //”bla bla” must not be a string v::not(v::string())->check('bla bla');
  54. 30 de Novembro PHP Conference 2012 54 Dá pra mudar

    o “123” e “bla bla” nas mensagens?
  55. 30 de Novembro PHP Conference 2012 55 //Nome Completo must

    be a string v::string() ->setName(“Nome Completo”) ->check(123); //Idade must not be a string v::not(v::string()) ->setName(“Idade”) ->check('bla bla');
  56. 30 de Novembro PHP Conference 2012 56 //Validadores Básicos de

    Tipo v::arr() v::date() v::float() v::int() v::nullValue() v::numeric() v::object() v::string() v::instance()
  57. 30 de Novembro PHP Conference 2012 57 //Validadores Básicos de

    Comparação v::equals($algo) // == v::equals($algo, true) // === v::max($a) // < v::max($a, true) // <= v::min($a) // > v::min($a, true) // >= v::between($a, $b) // >, < v::between($a, $b, true) // >=, <=
  58. 30 de Novembro PHP Conference 2012 58 //Validadores Básicos Numéricos

    v::even() v::odd() v::negative() v::positive() v::primeNumber() v::roman() // XVI v::multiple($algo) v::perfectSquare($algo)
  59. 30 de Novembro PHP Conference 2012 59 //Validadores Básicos de

    String v::alnum() v::alpha() v::digits() v::consonants() v::vowels() v::lowercase() v::uppercase() v::version() v::slug() // this-is-a-slug v::regex($exp)
  60. 30 de Novembro PHP Conference 2012 60 //Validadores do Zend

    v::zend('Hostname')->check('google.com'); //Validadores do Symfony v::sf('Time')->check('22:30:00');
  61. 30 de Novembro PHP Conference 2012 61 //Validadores Legais v::arr()

    ->each(v::instance(“MeuProduto”)) ->check($produtos); );
  62. 30 de Novembro PHP Conference 2012 62 //Validadores Legais v::between(1,

    15) ->check(7); v::between(“yesterday”, “tomorrow”) ->check(new DateTime);
  63. 30 de Novembro PHP Conference 2012 63 //Validadores Legais v::minimumAge(18)

    ->check(“1987-07-01”);
  64. 30 de Novembro PHP Conference 2012 64 //Validadores Legais v::leapDate()

    ->check(“1998-02-29”); v::leapYear() ->check(“1998”);
  65. 30 de Novembro PHP Conference 2012 65 //Validadores Legais v::contains(“bar”)

    ->check(“foo bar baz”); v::startsWith(“foo”) ->check(“foo bar baz”); v::endsWith(“baz”) ->check(“foo bar baz”);
  66. 30 de Novembro PHP Conference 2012 66 //Validadores Legais v::contains(“bar”)

    ->check(array(“foo bar baz”)); v::startsWith(“foo”) ->check(array(“foo bar baz”)); v::endsWith(“baz”) ->check(array(“foo bar baz”));
  67. 30 de Novembro PHP Conference 2012 67 //Validadores Legais v::oneOf(

    v::arr()->length(1, 15), v::object()->attribute(“items”) );
  68. 30 de Novembro PHP Conference 2012 68 Posso ter as

    minhas próprias regras?
  69. 30 de Novembro PHP Conference 2012 69 v::callback(function ($input) {

    return $input === 42; });
  70. 30 de Novembro PHP Conference 2012 70 Ok, mas posso

    ter meu próprio objeto?
  71. 30 de Novembro PHP Conference 2012 71 use Respect\Validation; class

    Universe implements Validation\Validatable extends Validation\Rules\AbstractRule { public function validate($input) { return $input === 42; } } v::int()->addRule(new Universe);
  72. 30 de Novembro PHP Conference 2012 72 E as mensagens?

  73. 30 de Novembro PHP Conference 2012 73 use Respect\Validation; class

    UniverseException extends Validation\Exceptions\ValidationException { public static $defaultTemplates = array( self::MODE_DEFAULT => array( self::STANDARD => '{{name}} must be 42', ), self::MODE_NEGATIVE => array( self::STANDARD => '{{name}} must not be 42', ) ); }
  74. 30 de Novembro PHP Conference 2012 74 Onde eu baixo?

  75. 30 de Novembro PHP Conference 2012 75 github.com/Respect/Validation Packagist respect.li/pear

  76. 30 de Novembro PHP Conference 2012 76 github.com/Respect/Validation Packagist respect.li/pear

    Perguntas?
  77. 30 de Novembro PHP Conference 2012 77 github.com/Respect/Validation Packagist respect.li/pear

    Obrigado! alexandre@gaigalas.net