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

    View full-size slide

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

    View full-size slide

  3. 30 de Novembro PHP Conference 2012 3
    @alganet

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 30 de Novembro PHP Conference 2012 12
    E se eu quiser exibir os erros?

    View full-size slide

  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 _”;

    View full-size slide

  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”;

    View full-size slide

  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);

    View full-size slide

  16. 30 de Novembro PHP Conference 2012 16
    E o erro para o “Sem espaços”?

    View full-size slide

  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”;
    /*...*/

    View full-size slide

  18. 30 de Novembro PHP Conference 2012 18
    Validation

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  24. 30 de Novembro PHP Conference 2012 24
    Tem um jeito mais simples?

    View full-size slide

  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

    View full-size slide

  26. 30 de Novembro PHP Conference 2012 26
    //true or false
    $validator->validate($algo);

    View full-size slide

  27. 30 de Novembro PHP Conference 2012 27
    E se eu quiser coletar os erros?

    View full-size slide

  28. 30 de Novembro PHP Conference 2012 28
    try {
    $validator->check(“e ae”);
    } catch (InvalidArgumentException $e) {
    echo $e->getMessage();
    }

    View full-size slide

  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
    }

    View full-size slide

  30. 30 de Novembro PHP Conference 2012 30
    //Dispara exception para o primeiro
    //erro
    $validator->check($algo);

    View full-size slide

  31. 30 de Novembro PHP Conference 2012 31
    E se eu quiser todos os erros?

    View full-size slide

  32. 30 de Novembro PHP Conference 2012 32
    try {
    $validator->assert(“e ae”);
    } catch (InvalidArgumentException $e) {
    echo $e->getFullMessage();
    }

    View full-size slide

  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#”);

    View full-size slide

  34. 30 de Novembro PHP Conference 2012 34
    E se eu quiser agrupar só alguns
    erros?

    View full-size slide

  35. 30 de Novembro PHP Conference 2012 35
    try {
    $validator->assert(“e ae”);
    } catch (InvalidArgumentException $e) {
    $e->findMessages(array(
    'alnum', 'length'
    ));
    }

    View full-size slide

  36. 30 de Novembro PHP Conference 2012 36
    E se eu quiser mensagens
    diferentes?

    View full-size slide

  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”
    ));
    }

    View full-size slide

  38. 30 de Novembro PHP Conference 2012 38
    //Dispara exception com todos os erros
    $validator->assert($algo);

    View full-size slide

  39. 30 de Novembro PHP Conference 2012 39
    E se eu quiser validar objetos
    inteiros?

    View full-size slide

  40. 30 de Novembro PHP Conference 2012 40
    class Tweet
    {
    public $text;
    public $created_at;
    public $user;
    }
    class User
    {
    public $name;
    }

    View full-size slide

  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;

    View full-size slide

  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))
    );

    View full-size slide

  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))
    );

    View full-size slide

  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))
    );

    View full-size slide

  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))
    );

    View full-size slide

  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))
    );

    View full-size slide

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

    View full-size slide

  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”);

    View full-size slide

  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'));

    View full-size slide

  50. 30 de Novembro PHP Conference 2012 50
    E se eu quiser negar uma regra?

    View full-size slide

  51. 30 de Novembro PHP Conference 2012 51
    //Nega qualquer regra
    v::not(v::string());

    View full-size slide

  52. 30 de Novembro PHP Conference 2012 52
    E as mensagens pra regras
    negadas?

    View full-size slide

  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');

    View full-size slide

  54. 30 de Novembro PHP Conference 2012 54
    Dá pra mudar o “123” e “bla bla”
    nas mensagens?

    View full-size slide

  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');

    View full-size slide

  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()

    View full-size slide

  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) // >=, <=

    View full-size slide

  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)

    View full-size slide

  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)

    View full-size slide

  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');

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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”);

    View full-size slide

  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”));

    View full-size slide

  67. 30 de Novembro PHP Conference 2012 67
    //Validadores Legais
    v::oneOf(
    v::arr()->length(1, 15),
    v::object()->attribute(“items”)
    );

    View full-size slide

  68. 30 de Novembro PHP Conference 2012 68
    Posso ter as minhas próprias
    regras?

    View full-size slide

  69. 30 de Novembro PHP Conference 2012 69
    v::callback(function ($input) {
    return $input === 42;
    });

    View full-size slide

  70. 30 de Novembro PHP Conference 2012 70
    Ok, mas posso ter meu próprio
    objeto?

    View full-size slide

  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);

    View full-size slide

  72. 30 de Novembro PHP Conference 2012 72
    E as mensagens?

    View full-size slide

  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',
    )
    );
    }

    View full-size slide

  74. 30 de Novembro PHP Conference 2012 74
    Onde eu baixo?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  77. 30 de Novembro PHP Conference 2012 77
    github.com/Respect/Validation
    Packagist
    respect.li/pear
    Obrigado!
    [email protected]

    View full-size slide