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

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! [email protected]