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

Domine Validação de Dados em 45min

Embed Size (px)

Citation preview

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]