Domine Validação de Dados em 45min

1,822 views

Published on

Published in: Technology

Domine Validação de Dados em 45min

  1. 1. Domine Validação de Dados em 45min30 de Novembro PHP Conference 2012 1
  2. 2. Alexandre Gaigalas http://about.me/alganet30 de Novembro PHP Conference 2012 2
  3. 3. @alganet30 de Novembro PHP Conference 2012 3
  4. 4. Alfanumérico @alganet30 de Novembro PHP Conference 2012 4
  5. 5. Alfanumérico Aceita _ @alganet30 de Novembro PHP Conference 2012 5
  6. 6. Alfanumérico Aceita _ @alganet Sem espaços30 de Novembro PHP Conference 2012 6
  7. 7. Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 7
  8. 8. /^[[:alnum:]_]{1,15}$/ (Expressão Regular) Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 8
  9. 9. /^[[:alnum:]_]{1,15}$/ Alfanumérico Aceita _ @alexandre_gomes_gaigalas Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 9
  10. 10. /^[[:alnum:]_]{1,15}$/ Alfanumérico Aceita _ @al-ga-net Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 10
  11. 11. /^[[:alnum:]_]{1,15}$/ Alfanumérico Aceita _ @Alexandre Gomes Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 11
  12. 12. E se eu quiser exibir os erros?30 de Novembro PHP Conference 2012 12
  13. 13. if (!ctype_alnum(str_replace(_, , $username))) echo “Username pode conter apenas letras, números e _”; Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 13
  14. 14. 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”; Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 14
  15. 15. $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); Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 15
  16. 16. E o erro para o “Sem espaços”?30 de Novembro PHP Conference 2012 16
  17. 17. $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”;/*...*/ Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 17
  18. 18. Validation30 de Novembro PHP Conference 2012 18
  19. 19. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf(); 30 de Novembro PHP Conference 2012 19
  20. 20. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf( new rAlnum(“_”)); 30 de Novembro PHP Conference 2012 20
  21. 21. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf( new rAlnum(“_”), new rNoWhitespace); 30 de Novembro PHP Conference 2012 21
  22. 22. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf( new rAlnum(“_”), new rNoWhitespace, new rLength(1, 15)); 30 de Novembro PHP Conference 2012 22
  23. 23. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf( new rAlnum(“_”), new rNoWhitespace, new rLength(1, 15));$isOk = $validator->validate(“alganet”); 30 de Novembro PHP Conference 2012 23
  24. 24. Tem um jeito mais simples?30 de Novembro PHP Conference 2012 24
  25. 25. Construção via Fluent Builderuse RespectValidationValidator as v;$validator = v::alnum(_) ->noWhitespace() ->length(1, 15);$isOk = $validator->validate(“alganet”); 30 de Novembro PHP Conference 2012 25
  26. 26. //true or false$validator->validate($algo);30 de Novembro PHP Conference 2012 26
  27. 27. E se eu quiser coletar os erros?30 de Novembro PHP Conference 2012 27
  28. 28. try { $validator->check(“e ae”);} catch (InvalidArgumentException $e) { echo $e->getMessage();} 30 de Novembro PHP Conference 2012 28
  29. 29. use RespectValidationExceptions as e;/* … */try { $validator->check(“e ae”);} catch (eAlnumException $e) { //faz algo} catch (eNoWhitespaceException $e) { //faz algo} catch (eLengthException $e) { //faz algo} 30 de Novembro PHP Conference 2012 29
  30. 30. //Dispara exception para o primeiro//erro$validator->check($algo);30 de Novembro PHP Conference 2012 30
  31. 31. E se eu quiser todos os erros?30 de Novembro PHP Conference 2012 31
  32. 32. try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { echo $e->getFullMessage();} 30 de Novembro PHP Conference 2012 32
  33. 33. $validator->assert(“td errado#”);-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 30 de Novembro PHP Conference 2012 33
  34. 34. E se eu quiser agrupar só alguns erros?30 de Novembro PHP Conference 2012 34
  35. 35. try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { $e->findMessages(array( alnum, length ));} 30 de Novembro PHP Conference 2012 35
  36. 36. E se eu quiser mensagens diferentes?30 de Novembro PHP Conference 2012 36
  37. 37. try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { $e->findMessages(array( alnum => “{{name}} Inválido”, length => “Tamanho de {{name}} incorreto” ));} 30 de Novembro PHP Conference 2012 37
  38. 38. //Dispara exception com todos os erros$validator->assert($algo);30 de Novembro PHP Conference 2012 38
  39. 39. E se eu quiser validar objetos inteiros?30 de Novembro PHP Conference 2012 39
  40. 40. class Tweet{ public $text; public $created_at; public $user;}class User{ public $name;} 30 de Novembro PHP Conference 2012 40
  41. 41. $user = new User;$user->name = alganet;$tweet = new Tweet;$tweet->user = $user;$tweet->text = “http://respect.li”;$tweet->created_at = new DateTime; 30 de Novembro PHP Conference 2012 41
  42. 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)) ); 30 de Novembro PHP Conference 2012 42
  43. 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)) ); 30 de Novembro PHP Conference 2012 43
  44. 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)) ); 30 de Novembro PHP Conference 2012 44
  45. 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)) ); 30 de Novembro PHP Conference 2012 45
  46. 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)) ); 30 de Novembro PHP Conference 2012 46
  47. 47. //Valida atributos de objetos v::object()->attribute(“name”); //Valida chaves de array v::arr()->key(“email”);30 de Novembro PHP Conference 2012 47
  48. 48. //Valida atributos de objetos v::object()->attribute(“name”) //N atributos... ->attribute(“sex”); //Valida chaves de array v::arr()->key(“email”) ->key(“sex”);30 de Novembro PHP Conference 2012 48
  49. 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));30 de Novembro PHP Conference 2012 49
  50. 50. E se eu quiser negar uma regra?30 de Novembro PHP Conference 2012 50
  51. 51. //Nega qualquer regrav::not(v::string());30 de Novembro PHP Conference 2012 51
  52. 52. E as mensagens pra regras negadas?30 de Novembro PHP Conference 2012 52
  53. 53. //”123” must be a stringv::string()->check(123);//”bla bla” must not be a stringv::not(v::string())->check(bla bla);30 de Novembro PHP Conference 2012 53
  54. 54. Dá pra mudar o “123” e “bla bla” nas mensagens?30 de Novembro PHP Conference 2012 54
  55. 55. //Nome Completo must be a stringv::string() ->setName(“Nome Completo”) ->check(123);//Idade must not be a stringv::not(v::string()) ->setName(“Idade”) ->check(bla bla);30 de Novembro PHP Conference 2012 55
  56. 56. //Validadores Básicos de Tipov::arr()v::date()v::float()v::int()v::nullValue()v::numeric()v::object()v::string()v::instance()30 de Novembro PHP Conference 2012 56
  57. 57. //Validadores Básicos de Comparaçãov::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) // >=, <=30 de Novembro PHP Conference 2012 57
  58. 58. //Validadores Básicos Numéricosv::even()v::odd()v::negative()v::positive()v::primeNumber()v::roman() // XVIv::multiple($algo)v::perfectSquare($algo)30 de Novembro PHP Conference 2012 58
  59. 59. //Validadores Básicos de Stringv::alnum()v::alpha()v::digits()v::consonants()v::vowels()v::lowercase()v::uppercase()v::version()v::slug() // this-is-a-slugv::regex($exp)30 de Novembro PHP Conference 2012 59
  60. 60. //Validadores do Zendv::zend(Hostname)->check(google.com);//Validadores do Symfonyv::sf(Time)->check(22:30:00);30 de Novembro PHP Conference 2012 60
  61. 61. //Validadores Legaisv::arr() ->each(v::instance(“MeuProduto”)) ->check($produtos););30 de Novembro PHP Conference 2012 61
  62. 62. //Validadores Legaisv::between(1, 15) ->check(7);v::between(“yesterday”, “tomorrow”) ->check(new DateTime);30 de Novembro PHP Conference 2012 62
  63. 63. //Validadores Legaisv::minimumAge(18) ->check(“1987-07-01”);30 de Novembro PHP Conference 2012 63
  64. 64. //Validadores Legaisv::leapDate() ->check(“1998-02-29”);v::leapYear() ->check(“1998”);30 de Novembro PHP Conference 2012 64
  65. 65. //Validadores Legaisv::contains(“bar”) ->check(“foo bar baz”);v::startsWith(“foo”) ->check(“foo bar baz”);v::endsWith(“baz”) ->check(“foo bar baz”);30 de Novembro PHP Conference 2012 65
  66. 66. //Validadores Legaisv::contains(“bar”) ->check(array(“foo bar baz”));v::startsWith(“foo”) ->check(array(“foo bar baz”));v::endsWith(“baz”) ->check(array(“foo bar baz”));30 de Novembro PHP Conference 2012 66
  67. 67. //Validadores Legaisv::oneOf( v::arr()->length(1, 15), v::object()->attribute(“items”));30 de Novembro PHP Conference 2012 67
  68. 68. Posso ter as minhas próprias regras?30 de Novembro PHP Conference 2012 68
  69. 69. v::callback(function ($input) { return $input === 42;});30 de Novembro PHP Conference 2012 69
  70. 70. Ok, mas posso ter meu próprio objeto?30 de Novembro PHP Conference 2012 70
  71. 71. use RespectValidation;class Universeimplements ValidationValidatableextends ValidationRulesAbstractRule{ public function validate($input) { return $input === 42; }}v::int()->addRule(new Universe);30 de Novembro PHP Conference 2012 71
  72. 72. E as mensagens?30 de Novembro PHP Conference 2012 72
  73. 73. use RespectValidation;class UniverseExceptionextends ValidationExceptionsValidationException{ 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, ) );}30 de Novembro PHP Conference 2012 73
  74. 74. Onde eu baixo?30 de Novembro PHP Conference 2012 74
  75. 75. github.com/Respect/Validation Packagist respect.li/pear30 de Novembro PHP Conference 2012 75
  76. 76. Perguntas? github.com/Respect/Validation Packagist respect.li/pear30 de Novembro PHP Conference 2012 76
  77. 77. Obrigado! alexandre@gaigalas.net github.com/Respect/Validation Packagist respect.li/pear30 de Novembro PHP Conference 2012 77

×