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étodoValidate::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/