Validador
Hay muchos validadores disponibles en Composer que se pueden utilizar directamente, como 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
Comienzo rápido
Cree 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 tener más de 25 caracteres',
'age.number' => 'La edad debe ser un número',
'age.between' => 'La edad solo puede 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());
}
Validador workerman/validation
Descripción
Proyecto como 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
Comienzo 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:
{"code":500,"msg":"El nombre de usuario solo puede contener letras (a-z) y números (0-9)"}
Explicación:
v::input(array $input, array $rules)
se utiliza para validar y recopilar datos. Si la validación falla, se genera una excepción Respect\Validation\Exceptions\ValidationException
, de lo contrario, devuelve los datos validados (un array).
Si el código del negocio no captura la excepción de validación, el marco de trabajo webman la capturará automáticamente y devolverá datos en formato JSON (similar a {"code":500, "msg":"xxx"}
) o una página de excepción común según el encabezado de la solicitud HTTP. Si el formato de retorno no cumple con las necesidades del negocio, el desarrollador puede capturar manualmente la excepción ValidationException
y devolver los datos necesarios, como en este 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 del Validador
use Respect\Validation\Validator as v;
// Validación de una sola regla
$number = 123;
v::numericVal()->validate($number); // true
// Validación en cadena de varias reglas
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// Obtener la primera razón de fallo de 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 todas las razones de fallo de validación
try {
$usernameValidator->setName('nombre de usuario')->assert('alg anet');
} catch (ValidationException $exception) {
echo $exception->getFullMessage();
// 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());
// 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',
// )
}
// Mensaje de error personalizado
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 contener espacios',
'length' => 'length se ajusta a la regla, por lo que esta no se mostrará'
]);
// Imprimirá
// array(
// 'alnum' => 'El nombre de usuario solo puede contener letras y números',
// 'noWhitespace' => 'El nombre de usuario no puede contener espacios'
// )
}
// Validación 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
// Validación 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); // 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
// Regla de negación
v::not(v::intVal())->validate(10); // false
Diferencia entre los tres métodos del Validador validate()
, check()
, assert()
validate()
devuelve un valor booleano y no genera una excepción
check()
genera una excepción en caso de error de validación y devuelve el motivo del primer error a través de $exception->getMessage()
assert()
genera una excepción en caso de error de validación y a través de $exception->getFullMessage()
se pueden obtener todos los motivos de error de validación
Lista de reglas de validación comunes
Alnum()
contiene solo letras y números
Alpha()
contiene solo letras
ArrayType()
tipo array
Between(mixed $minimum, mixed $maximum)
verifica si el valor está entre dos valores
BoolType()
verifica si es de tipo booleano
Contains(mixed $expectedValue)
verifica si el valor contiene ciertos valores
ContainsAny(array $needles)
verifica si el valor contiene al menos uno de los valores definidos
Digit()
verifica si el valor contiene solo dígitos
Domain()
verifica si es un dominio válido
Email()
verifica si es una dirección de correo electrónico válida
Extension(string $extension)
verifica la extensión
FloatType()
verifica si es de tipo flotante
IntType()
verifica si es un entero
Ip()
verifica si es una dirección IP
Json()
verifica si es un dato JSON
Length(int $min, int $max)
verifica si la longitud está en el rango dado
LessThan(mixed $compareTo)
verifica si la longitud es menor que el valor dado
Lowercase()
verifica si la cadena contiene solo letras minúsculas
MacAddress()
verifica si es una dirección MAC
NotEmpty()
verifica si no está vacío
NullType()
verifica si es nulo
Number()
verifica si es un número
ObjectType()
verifica si es de tipo objeto
StringType()
verifica si es de tipo string
Url()
verifica si es una URL
Para más reglas de validación, consulta https://respect-validation.readthedocs.io/en/2.0/list-of-rules/