Validador

composer tiene muchos validadores que se pueden usar directamente, por ejemplo:

top-think/think-validate

respect/validation

Validador top-think/think-validate

Descripción

Validador oficial de ThinkPHP

Dirección del proyecto

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

Instalación

composer require topthink/think-validate

Inicio rápido

Crea 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' => 'El nombre es obligatorio',
        'name.max'     => 'El nombre no puede exceder los 25 caracteres',
        'age.number'   => 'La edad debe ser un número',
        'age.between'  => 'La edad debe estar entre 1 y 120',
        'email'        => 'Formato de correo electrónico incorrecto',    
    ];

}

Uso

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

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

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

Nota
El método Validate::rule() de think-validate no es compatible en webman.

Validador workerman/validation

Descripción

Este proyecto es una versión traducida de https://github.com/Respect/Validation

Dirección del proyecto

https://github.com/walkor/validation

Instalación

composer require workerman/validation

Inicio 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('Apodo'),
            'username' => v::alnum()->length(5, 64)->setName('Nombre de usuario'),
            'password' => v::length(5, 64)->setName('Contraseña')
        ]);
        Db::table('user')->insert($data);
        return json(['code' => 0, 'msg' => 'ok']);
    }
}  

Acceso a través de jQuery

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

Resultado obtenido:

{"code":500,"msg":"El nombre de usuario solo puede contener letras (a-z) y números (0-9)"}

Descripción:

v::input(array $input, array $rules) se usa para validar y recopilar datos; si la validación de datos falla, lanzará la excepción Respect\Validation\Exceptions\ValidationException; si la validación es exitosa, devolverá los datos validados (array).

Si el código de negocio no captura la excepción de validación, el marco webman la capturará automáticamente y elegirá devolver datos json según el encabezado de la solicitud HTTP (similar a {"code":500, "msg":"xxx"}) o una página de error ordinaria. Si el formato de retorno no se ajusta a los requerimientos del negocio, el desarrollador puede capturar la excepción ValidationException y devolver los datos necesarios, similar al siguiente ejemplo:

<?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('Nombre de usuario'),
                'password' => v::length(5, 64)->setName('Contraseña')
            ]);
        } catch (ValidationException $e) {
            return json(['code' => 500, 'msg' => $e->getMessage()]);
        }
        return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
    }
}

Guía de funciones de Validator

use Respect\Validation\Validator as v;

// Validación de una sola regla
$number = 123;
v::numericVal()->validate($number); // true

// Validación de múltiples reglas en cadena
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true

// Obtener el primer motivo del fallo en la validación
try {
    $usernameValidator->setName('Nombre de usuario')->check('alg  anet');
} catch (ValidationException $exception) {
    echo $exception->getMessage(); // El nombre de usuario solo puede contener letras (a-z) y números (0-9)
}

// Obtener todos los motivos de fallo en la validación
try {
    $usernameValidator->setName('Nombre de usuario')->assert('alg  anet');
} catch (ValidationException $exception) {
    echo $exception->getFullMessage();
    // Se imprimirá
    // -  El nombre de usuario debe cumplir con las siguientes reglas
    //     - El nombre de usuario solo puede contener letras (a-z) y números (0-9)
    //     - El nombre de usuario no puede contener espacios

    var_export($exception->getMessages());
    // Se imprimirá
    // array (
    //   'alnum' => 'El nombre de usuario solo puede contener letras (a-z) y números (0-9)',
    //   'noWhitespace' => 'El nombre de usuario no puede contener espacios',
    // )
}

// Mensajes de error personalizados
try {
    $usernameValidator->setName('Nombre de usuario')->assert('alg  anet');
} catch (ValidationException $exception) {
    var_export($exception->getMessages([
        'alnum' => 'El nombre de usuario solo puede contener letras y números',
        'noWhitespace' => 'El nombre de usuario no puede tener espacios',
        'length' => 'La longitud cumple con las reglas, así que este no se mostrará'
    ]));
    // Se imprimirá 
    // array(
    //    'alnum' => 'El nombre de usuario solo puede contener letras y números',
    //    'noWhitespace' => 'El nombre de usuario no puede tener espacios'
    // )
}

// Validación de objetos
$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

// Validación de arrays
$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); // también se puede usar check() o validate()

// Validación opcional
v::alpha()->validate(''); // false 
v::alpha()->validate(null); // false 
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true

// Reglas de negación
v::not(v::intVal())->validate(10); // false

Diferencias entre los tres métodos validate(), check(), assert()

validate() devuelve un valor booleano y no lanza excepciones.

check() lanza una excepción al fallar la validación, se puede obtener el primer motivo del fallo a través de $exception->getMessage().

assert() lanza una excepción al fallar la validación, se puede obtener todos los motivos del fallo a través de $exception->getFullMessage().

Lista de reglas de validación comunes

Alnum() solo contiene letras y números

Alpha() solo contiene letras

ArrayType() tipo array

Between(mixed $minimum, mixed $maximum) valida si la entrada está entre otros dos valores.

BoolType() verifica si es de tipo booleano

Contains(mixed $expectedValue) valida si la entrada contiene ciertos valores

ContainsAny(array $needles) valida si la entrada contiene al menos un valor definido

Digit() valida si la entrada solo contiene números

Domain() valida si es un nombre de dominio válido

Email() valida si es una dirección de correo electrónico válida

Extension(string $extension) valida la extensión del archivo

FloatType() valida si es de tipo flotante

IntType() valida si es un entero

Ip() valida si es una dirección ip

Json() valida si es datos en formato json

Length(int $min, int $max) valida si la longitud está en el rango especificado

LessThan(mixed $compareTo) valida si la longitud es menor que un valor dado

Lowercase() valida si son letras minúsculas

MacAddress() valida si es una dirección mac

NotEmpty() valida si no está vacío

NullType() valida si es null

Number() valida si es un número

ObjectType() valida si es un objeto

StringType() valida si es de tipo string

Url() valida si es una url

Para más reglas de validación, consulte https://respect-validation.readthedocs.io/en/2.0/list-of-rules/

Más contenido

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