Domine Validação de Dados em 45min
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Domine Validação de Dados em 45min

on

  • 1,381 views

 

Statistics

Views

Total Views
1,381
Views on SlideShare
1,376
Embed Views
5

Actions

Likes
8
Downloads
7
Comments
0

1 Embed 5

https://twitter.com 5

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Domine Validação de Dados em 45min Presentation Transcript

  • 1. Domine Validação de Dados em 45min30 de Novembro PHP Conference 2012 1
  • 2. Alexandre Gaigalas http://about.me/alganet30 de Novembro PHP Conference 2012 2
  • 3. @alganet30 de Novembro PHP Conference 2012 3
  • 4. Alfanumérico @alganet30 de Novembro PHP Conference 2012 4
  • 5. Alfanumérico Aceita _ @alganet30 de Novembro PHP Conference 2012 5
  • 6. Alfanumérico Aceita _ @alganet Sem espaços30 de Novembro PHP Conference 2012 6
  • 7. Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 7
  • 8. /^[[:alnum:]_]{1,15}$/ (Expressão Regular) Alfanumérico Aceita _ @alganet Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 8
  • 9. /^[[:alnum:]_]{1,15}$/ Alfanumérico Aceita _ @alexandre_gomes_gaigalas Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 9
  • 10. /^[[:alnum:]_]{1,15}$/ Alfanumérico Aceita _ @al-ga-net Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 10
  • 11. /^[[:alnum:]_]{1,15}$/ Alfanumérico Aceita _ @Alexandre Gomes Sem espaços 1-15 caracteres30 de Novembro PHP Conference 2012 11
  • 12. E se eu quiser exibir os erros?30 de Novembro PHP Conference 2012 12
  • 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. 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. $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. E o erro para o “Sem espaços”?30 de Novembro PHP Conference 2012 16
  • 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. Validation30 de Novembro PHP Conference 2012 18
  • 19. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf(); 30 de Novembro PHP Conference 2012 19
  • 20. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf( new rAlnum(“_”)); 30 de Novembro PHP Conference 2012 20
  • 21. Construindo um Validatoruse RespectValidationRules as r;$validator = new rAllOf( new rAlnum(“_”), new rNoWhitespace); 30 de Novembro PHP Conference 2012 21
  • 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. 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. Tem um jeito mais simples?30 de Novembro PHP Conference 2012 24
  • 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. //true or false$validator->validate($algo);30 de Novembro PHP Conference 2012 26
  • 27. E se eu quiser coletar os erros?30 de Novembro PHP Conference 2012 27
  • 28. try { $validator->check(“e ae”);} catch (InvalidArgumentException $e) { echo $e->getMessage();} 30 de Novembro PHP Conference 2012 28
  • 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. //Dispara exception para o primeiro//erro$validator->check($algo);30 de Novembro PHP Conference 2012 30
  • 31. E se eu quiser todos os erros?30 de Novembro PHP Conference 2012 31
  • 32. try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { echo $e->getFullMessage();} 30 de Novembro PHP Conference 2012 32
  • 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. E se eu quiser agrupar só alguns erros?30 de Novembro PHP Conference 2012 34
  • 35. try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { $e->findMessages(array( alnum, length ));} 30 de Novembro PHP Conference 2012 35
  • 36. E se eu quiser mensagens diferentes?30 de Novembro PHP Conference 2012 36
  • 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. //Dispara exception com todos os erros$validator->assert($algo);30 de Novembro PHP Conference 2012 38
  • 39. E se eu quiser validar objetos inteiros?30 de Novembro PHP Conference 2012 39
  • 40. class Tweet{ public $text; public $created_at; public $user;}class User{ public $name;} 30 de Novembro PHP Conference 2012 40
  • 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. $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. $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. $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. $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. $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. //Valida atributos de objetos v::object()->attribute(“name”); //Valida chaves de array v::arr()->key(“email”);30 de Novembro PHP Conference 2012 47
  • 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. //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. E se eu quiser negar uma regra?30 de Novembro PHP Conference 2012 50
  • 51. //Nega qualquer regrav::not(v::string());30 de Novembro PHP Conference 2012 51
  • 52. E as mensagens pra regras negadas?30 de Novembro PHP Conference 2012 52
  • 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. Dá pra mudar o “123” e “bla bla” nas mensagens?30 de Novembro PHP Conference 2012 54
  • 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. //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. //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. //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. //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. //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. //Validadores Legaisv::arr() ->each(v::instance(“MeuProduto”)) ->check($produtos););30 de Novembro PHP Conference 2012 61
  • 62. //Validadores Legaisv::between(1, 15) ->check(7);v::between(“yesterday”, “tomorrow”) ->check(new DateTime);30 de Novembro PHP Conference 2012 62
  • 63. //Validadores Legaisv::minimumAge(18) ->check(“1987-07-01”);30 de Novembro PHP Conference 2012 63
  • 64. //Validadores Legaisv::leapDate() ->check(“1998-02-29”);v::leapYear() ->check(“1998”);30 de Novembro PHP Conference 2012 64
  • 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. //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. //Validadores Legaisv::oneOf( v::arr()->length(1, 15), v::object()->attribute(“items”));30 de Novembro PHP Conference 2012 67
  • 68. Posso ter as minhas próprias regras?30 de Novembro PHP Conference 2012 68
  • 69. v::callback(function ($input) { return $input === 42;});30 de Novembro PHP Conference 2012 69
  • 70. Ok, mas posso ter meu próprio objeto?30 de Novembro PHP Conference 2012 70
  • 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. E as mensagens?30 de Novembro PHP Conference 2012 72
  • 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. Onde eu baixo?30 de Novembro PHP Conference 2012 74
  • 75. github.com/Respect/Validation Packagist respect.li/pear30 de Novembro PHP Conference 2012 75
  • 76. Perguntas? github.com/Respect/Validation Packagist respect.li/pear30 de Novembro PHP Conference 2012 76
  • 77. Obrigado! alexandre@gaigalas.net github.com/Respect/Validation Packagist respect.li/pear30 de Novembro PHP Conference 2012 77