Validador

O composer possui muitos validadores que podem ser utilizados diretamente, por exemplo:

top-think/think-validate

respect/validation

Validador top-think/think-validate

Descrição

Validador oficial do ThinkPHP

Endereço do projeto

https://github.com/top-think/think-validate

Instalação

composer require topthink/think-validate

Início Rápido

Crie app/index/validate/User.php

<?php
namespace app\index\validate;

use think\Validate;

class User extends Validate
{
    protected $rule =   [
        'name'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ];

    protected $message  =   [
        'name.require' => 'Nome é obrigatório',
        'name.max'     => 'O nome não pode ter mais de 25 caracteres',
        'age.number'   => 'A idade deve ser um número',
        'age.between'  => 'A idade deve estar entre 1 e 120',
        'email'        => 'Formato de e-mail inválido',    
    ];

}

Uso

$data = [
    'name'  => 'thinkphp',
    'email' => 'thinkphp@qq.com',
];

$validate = new \app\index\validate\User;

if (!$validate->check($data)) {
    var_dump($validate->getError());
}

Nota
O webman não suporta o método Validate::rule() do think-validate

Validador workerman/validation

Descrição

Este projeto é uma versão traduzida do https://github.com/Respect/Validation

Endereço do projeto

https://github.com/walkor/validation

Instalação

composer require workerman/validation

Início Rápido

<?php
namespace app\controller;

use support\Request;
use Respect\Validation\Validator as v;
use support\Db;

class IndexController
{
    public function index(Request $request)
    {
        $data = v::input($request->post(), [
            'nickname' => v::length(1, 64)->setName('Apelido'),
            'username' => v::alnum()->length(5, 64)->setName('Nome de usuário'),
            'password' => v::length(5, 64)->setName('Senha')
        ]);
        Db::table('user')->insert($data);
        return json(['code' => 0, 'msg' => 'ok']);
    }
}  

Acessar através do jQuery

  $.ajax({
      url : 'http://127.0.0.1:8787',
      type : "post",
      dataType:'json',
      data : {nickname:'Tom', username:'tom cat', password: '123456'}
  });

Resultado obtido:

{"code":500,"msg":"Nome de usuário só pode conter letras (a-z) e números (0-9)"}

Explicação:

v::input(array $input, array $rules) é usado para validar e coletar dados. Se a validação de dados falhar, será lançada a exceção Respect\Validation\Exceptions\ValidationException. Se a validação for bem-sucedida, os dados validados (array) serão retornados.

Se o código de negócio não capturar a exceção de validação, o framework webman irá capturar automaticamente e, com base no cabeçalho da solicitação HTTP, retornará dados JSON (semelhante a {"code":500, "msg":"xxx"}) ou uma página de erro comum. Se o formato de retorno não estiver de acordo com as necessidades do negócio, o desenvolvedor pode capturar a exceção ValidationException e retornar os dados necessários, semelhante ao exemplo abaixo:

<?php
namespace app\controller;

use support\Request;
use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\ValidationException;

class IndexController
{
    public function index(Request $request)
    {
        try {
            $data = v::input($request->post(), [
                'username' => v::alnum()->length(5, 64)->setName('Nome de usuário'),
                'password' => v::length(5, 64)->setName('Senha')
            ]);
        } catch (ValidationException $e) {
            return json(['code' => 500, 'msg' => $e->getMessage()]);
        }
        return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
    }
}

Guia de Funcionalidades do Validador

use Respect\Validation\Validator as v;

// Validação de uma única regra
$number = 123;
v::numericVal()->validate($number); // true

// Validação de várias regras em cadeia
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true

// Obter a primeira razão da falha de validação
try {
    $usernameValidator->setName('Nome de usuário')->check('alg  anet');
} catch (ValidationException $exception) {
    echo $exception->getMessage(); // Nome de usuário só pode conter letras (a-z) e números (0-9)
}

// Obter todas as razões da falha de validação
try {
    $usernameValidator->setName('Nome de usuário')->assert('alg  anet');
} catch (ValidationException $exception) {
    echo $exception->getFullMessage();
    // será impresso
    // -  Nome de usuário deve atender às seguintes regras
    //     - Nome de usuário só pode conter letras (a-z) e números (0-9)
    //     - Nome de usuário não pode conter espaços

    var_export($exception->getMessages());
    // será impresso
    // array (
    //   'alnum' => 'Nome de usuário só pode conter letras (a-z) e números (0-9)',
    //   'noWhitespace' => 'Nome de usuário não pode conter espaços',
    // )
}

// Mensagens de erro personalizadas
try {
    $usernameValidator->setName('Nome de usuário')->assert('alg  anet');
} catch (ValidationException $exception) {
    var_export($exception->getMessages([
        'alnum' => 'Nome de usuário só pode conter letras e números',
        'noWhitespace' => 'Nome de usuário não pode ter espaços',
        'length' => 'A regra de comprimento é válida, então esta não será exibida'
    ]));
    // será impresso 
    // array(
    //    'alnum' => 'Nome de usuário só pode conter letras e números',
    //    'noWhitespace' => 'Nome de usuário não pode ter espaços'
    // )
}

// Validação de objeto
$user = new stdClass;
$user->name = 'Alexandre';
$user->birthdate = '1987-07-01';
$userValidator = v::attribute('name', v::stringType()->length(1, 32))
                ->attribute('birthdate', v::date()->minAge(18));
$userValidator->validate($user); // true

// Validação de array
$data = [
    'parentKey' => [
        'field1' => 'value1',
        'field2' => 'value2',
        'field3' => true,
    ]
];
v::key(
    'parentKey',
    v::key('field1', v::stringType())
        ->key('field2', v::stringType())
        ->key('field3', v::boolType())
    )
    ->assert($data); // também pode usar check() ou validate()

// Validação opcional
v::alpha()->validate(''); // false 
v::alpha()->validate(null); // false 
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true

// Regras de negação
v::not(v::intVal())->validate(10); // false

Diferença entre os métodos validate(), check() e assert()

validate() retorna um valor booleano, não lança exceções.

check() lança exceções quando a validação falha, e pode obter a primeira razão da falha através de $exception->getMessage().

assert() lança exceções quando a validação falha, e pode obter todas as razões da falha através de $exception->getFullMessage().

Lista de regras de validação comuns

Alnum() somente letras e números

Alpha() somente letras

ArrayType() tipo de array

Between(mixed $minimum, mixed $maximum) valida se a entrada está entre outros dois valores.

BoolType() valida se é do tipo booleano

Contains(mixed $expectedValue) valida se a entrada contém certos valores

ContainsAny(array $needles) valida se a entrada contém pelo menos um dos valores definidos

Digit() valida se a entrada contém apenas dígitos

Domain() valida se é um nome de domínio válido

Email() valida se é um endereço de e-mail válido

Extension(string $extension) valida o sufixo

FloatType() valida se é do tipo float

IntType() valida se é do tipo inteiro

Ip() valida se é um endereço IP

Json() valida se é um dado JSON

Length(int $min, int $max) valida se o comprimento está no intervalo dado

LessThan(mixed $compareTo) valida se o comprimento é menor que o valor dado

Lowercase() valida se é uma letra minúscula

MacAddress() valida se é um endereço MAC

NotEmpty() valida se não está vazio

NullType() valida se é nulo

Number() valida se é um número

ObjectType() valida se é um objeto

StringType() valida se é do tipo string

Url() valida se é uma URL

Para mais regras de validação, consulte https://respect-validation.readthedocs.io/en/2.0/list-of-rules/

Mais Conteúdo

Acesse https://respect-validation.readthedocs.io/en/2.0/