Top Banner
30 de Novembro PHP Conference 2012 1 Domine Validação de Dados em 45min
77

Domine Validação de Dados em 45min

Jul 05, 2015

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 1

Domine

Validação de Dadosem 45min

Page 2: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 2

Alexandre Gaigalashttp://about.me/alganet

Page 3: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 3

@alganet

Page 4: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 4

@alganet

Alfanumérico

Page 5: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 5

@alganet

Alfanumérico Aceita _

Page 6: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 6

@alganet

Alfanumérico Aceita _

Sem espaços

Page 7: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 7

@alganet

Alfanumérico Aceita _

1-15 caracteresSem espaços

Page 8: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 8

@alganet

Alfanumérico Aceita _

1-15 caracteresSem espaços

/^[[:alnum:]_]{1,15}$/(Expressão Regular)

Page 9: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 9

@alexandre_gomes_gaigalas

Alfanumérico Aceita _

1-15 caracteresSem espaços

/^[[:alnum:]_]{1,15}$/

Page 10: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 10

@al-ga-net

Alfanumérico Aceita _

1-15 caracteresSem espaços

/^[[:alnum:]_]{1,15}$/

Page 11: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 11

@Alexandre Gomes

Alfanumérico Aceita _

1-15 caracteresSem espaços

/^[[:alnum:]_]{1,15}$/

Page 12: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 12

E se eu quiser exibir os erros?

Page 13: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 13

@alganet

Alfanumérico Aceita _

1-15 caracteresSem espaços

if (!ctype_alnum(str_replace('_', '', $username))) echo “Username pode conter apenas letras, números e _”;

Page 14: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 14

@alganet

Alfanumérico Aceita _

1-15 caracteresSem 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”;

Page 15: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 15

@alganet

Alfanumérico Aceita _

1-15 caracteresSem 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);

Page 16: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 16

E o erro para o “Sem espaços”?

Page 17: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 17

@alganet

Alfanumérico Aceita _

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

Page 18: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 18

Validation

Page 19: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 19

use Respect\Validation\Rules as r;

$validator = new r\AllOf(

);

Construindo um Validator

Page 20: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 20

use Respect\Validation\Rules as r;

$validator = new r\AllOf( new r\Alnum(“_”)

);

Construindo um Validator

Page 21: Domine Validação de Dados em 45min

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

Page 22: Domine Validação de Dados em 45min

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

Page 23: Domine Validação de Dados em 45min

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

Page 24: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 24

Tem um jeito mais simples?

Page 25: Domine Validação de Dados em 45min

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

Page 26: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 26

//true or false$validator->validate($algo);

Page 27: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 27

E se eu quiser coletar os erros?

Page 28: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 28

try { $validator->check(“e ae”);} catch (InvalidArgumentException $e) { echo $e->getMessage();}

Page 29: Domine Validação de Dados em 45min

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}

Page 30: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 30

//Dispara exception para o primeiro//erro$validator->check($algo);

Page 31: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 31

E se eu quiser todos os erros?

Page 32: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 32

try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { echo $e->getFullMessage();}

Page 33: Domine Validação de Dados em 45min

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

Page 34: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 34

E se eu quiser agrupar só alguns erros?

Page 35: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 35

try { $validator->assert(“e ae”);} catch (InvalidArgumentException $e) { $e->findMessages(array( 'alnum', 'length' ));}

Page 36: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 36

E se eu quiser mensagens diferentes?

Page 37: Domine Validação de Dados em 45min

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

Page 38: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 38

//Dispara exception com todos os erros$validator->assert($algo);

Page 39: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 39

E se eu quiser validar objetos inteiros?

Page 40: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 40

class Tweet { public $text; public $created_at; public $user;}

class User{ public $name;}

Page 41: Domine Validação de Dados em 45min

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;

Page 42: Domine Validação de Dados em 45min

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

Page 43: Domine Validação de Dados em 45min

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

Page 44: Domine Validação de Dados em 45min

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

Page 45: Domine Validação de Dados em 45min

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

Page 46: Domine Validação de Dados em 45min

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

Page 47: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 47

//Valida atributos de objetosv::object()->attribute(“name”);

//Valida chaves de arrayv::arr()->key(“email”);

Page 48: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 48

//Valida atributos de objetosv::object()->attribute(“name”) //N atributos... ->attribute(“sex”);

//Valida chaves de arrayv::arr()->key(“email”) ->key(“sex”);

Page 49: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 49

//Valida atributos de objetosv::object()->attribute(“name”) //N atributos... ->attribute(“sex”, //Valida o valor também v::in('F', 'M'));

//Valida chaves de arrayv::arr()->key(“email”) ->key(“sex”, v::in('F', 'M'));

Page 50: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 50

E se eu quiser negar uma regra?

Page 51: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 51

//Nega qualquer regrav::not(v::string());

Page 52: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 52

E as mensagens pra regras negadas?

Page 53: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 53

//”123” must be a stringv::string()->check(123);

//”bla bla” must not be a stringv::not(v::string())->check('bla bla');

Page 54: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 54

Dá pra mudar o “123” e “bla bla” nas mensagens?

Page 55: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 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');

Page 56: Domine Validação de Dados em 45min

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

Page 57: Domine Validação de Dados em 45min

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

Page 58: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 58

//Validadores Básicos Numéricos

v::even()v::odd()v::negative()v::positive()v::primeNumber()v::roman() // XVIv::multiple($algo)v::perfectSquare($algo)

Page 59: Domine Validação de Dados em 45min

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-slugv::regex($exp)

Page 60: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 60

//Validadores do Zendv::zend('Hostname')->check('google.com');

//Validadores do Symfonyv::sf('Time')->check('22:30:00');

Page 61: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 61

//Validadores Legaisv::arr() ->each(v::instance(“MeuProduto”)) ->check($produtos); );

Page 62: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 62

//Validadores Legais

v::between(1, 15) ->check(7);

v::between(“yesterday”, “tomorrow”) ->check(new DateTime);

Page 63: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 63

//Validadores Legais

v::minimumAge(18) ->check(“1987-07-01”);

Page 64: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 64

//Validadores Legais

v::leapDate() ->check(“1998-02-29”);

v::leapYear() ->check(“1998”);

Page 65: Domine Validação de Dados em 45min

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

Page 66: Domine Validação de Dados em 45min

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

Page 67: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 67

//Validadores Legais

v::oneOf( v::arr()->length(1, 15), v::object()->attribute(“items”));

Page 68: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 68

Posso ter as minhas próprias regras?

Page 69: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 69

v::callback(function ($input) { return $input === 42;});

Page 70: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 70

Ok, mas posso ter meu próprio objeto?

Page 71: Domine Validação de Dados em 45min

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

Page 72: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 72

E as mensagens?

Page 73: Domine Validação de Dados em 45min

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

Page 74: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 74

Onde eu baixo?

Page 75: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 75

github.com/Respect/ValidationPackagistrespect.li/pear

Page 76: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 76

github.com/Respect/ValidationPackagistrespect.li/pear

Perguntas?

Page 77: Domine Validação de Dados em 45min

30 de Novembro PHP Conference 2012 77

github.com/Respect/ValidationPackagistrespect.li/pear

Obrigado!

[email protected]