selective/验证

验证错误收集器和转换器

2.1.0 2023-09-09 22:02 UTC

This package is auto-updated.

Last update: 2024-09-10 00:06:48 UTC


README

这是一个使用通知模式的PHP验证库。

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

目录

要求

  • PHP 8.1+

安装

composer require selective/validation

用法

通知是一系列错误

为了使用通知,你必须创建ValidationResult对象。一个ValidationResult可以非常简单

<?php

use Selective\Validation\Exception\ValidationException;
use Selective\Validation\ValidationResult;

$validationResult = new ValidationResult();

if (empty($data['username'])) {
    $validationResult->addError('username', 'Input required');
}

你现在可以测试ValidationResult并在其中包含错误时抛出异常。

<?php
if ($validationResult->fails()) {
    throw new ValidationException('Please check your input', $validationResult);
}

验证表单数据

登录示例

<?php

use Selective\Validation\Exception\ValidationException;
use Selective\Validation\ValidationResult;

// ...

// Get all POST values
$data = (array)$request->getParsedBody();

$validation = new ValidationResult();

// Validate username
if (empty($data['username'])) {
    $validation->addError('username', 'Input required');
}

// Validate password
if (empty($data['password'])) {
    $validation->addError('password', 'Input required');
}

// Check validation result
if ($validation->fails()) {
    // Trigger error response (see validation middleware)
    throw new ValidationException('Please check your input', $validation);
}

验证JSON

验证JSON请求就像验证表单数据一样,因为在PHP中它只是请求对象中的一个数组。

<?php
use Selective\Validation\ValidationResult;

// Fetch json data from request as array
$jsonData = (array)$request->getParsedBody();

$validation = new ValidationResult();

// ...

if ($validation->fails()) {
    throw new ValidationException('Please check your input', $validation);
}

在纯PHP中,你可以按以下方式获取JSON请求

<?php

$jsonData = (array)json_decode(file_get_contents('php://input'), true);

// ...

正则表达式

Selective\Validation\Regex\ValidationRegex类允许你验证给定的字符串是否与定义的正则表达式匹配。

示例用法

use Selective\Validation\Factory\CakeValidationFactory;
use Selective\Validation\Regex\ValidationRegex;
// ...

$data = [ /* ... */ ];

$validationFactory = new CakeValidationFactory();
$validator = $validationFactory->createValidator();

$validator
    ->regex('id', ValidationRegex::ID, 'Invalid')
    ->regex('country', ValidationRegex::COUNTRY_ISO_2, 'Invalid country')
    ->regex('date_of_birth', ValidationRegex::DATE_DMY, 'Invalid date format');

中间件

ValidationExceptionMiddleware捕获ValidationException并将其转换为漂亮的JSON响应。

Slim 4集成

插入ValidationExceptionMiddleware::class的容器定义

<?php

use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Selective\Validation\Encoder\JsonEncoder;
use Selective\Validation\Middleware\ValidationExceptionMiddleware;
use Selective\Validation\Transformer\ErrorDetailsResultTransformer;
use Slim\App;
use Slim\Factory\AppFactory;
// ...

return [
    ValidationExceptionMiddleware::class => function (ContainerInterface $container) {
        $factory = $container->get(ResponseFactoryInterface::class);

        return new ValidationExceptionMiddleware(
            $factory, 
            new ErrorDetailsResultTransformer(), 
            new JsonEncoder()
        );
    },

    ResponseFactoryInterface::class => function (ContainerInterface $container) {
        $app = $container->get(App::class);

        return $app->getResponseFactory();
    },

    App::class => function (ContainerInterface $container) {
        AppFactory::setContainer($container);

        return AppFactory::create();
    },

    // ...

];

ValidationExceptionMiddleware添加到你的中间件堆栈中

<?php

use Selective\Validation\Middleware\ValidationExceptionMiddleware;
use Slim\Factory\AppFactory;

require_once __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

// ...

$app->add(ValidationExceptionMiddleware::class);

// ...

$app->run();

Slim中的用法

<?php

use Selective\Validation\ValidationException;
use Selective\Validation\ValidationResult;

$validation = new ValidationResult();

// Validate username
if (empty($data->username)) {
    $validation->addError('username', 'Input required');
}

// Check validation result
if ($validation->fails()) {
    // Trigger the validation middleware
    throw new ValidationException('Please check your input', $validation);
}

验证器

你可以将这个库与一个实际验证输入数据的验证器结合起来。

转换器模式使得将一个类的实例映射到另一个类的实例变得简单。

CakePHP验证器

cakephp/validation库提供了构建验证器功能,可以轻松验证任意数组的数据。

安装

composer require cakephp/validation

用法

当存在验证失败时,Cake\Validation\Validator::validate()方法返回一个非空数组。然后可以使用Selective\Validation\Factory\CakeValidationFactorySelective\Validation\Converter\CakeValidationConverter将错误列表转换为ValidationResult

例如,如果你想验证登录表单,你可以这样做

use Selective\Validation\Factory\CakeValidationFactory;
use Selective\Validation\Exception\ValidationException;
// ...

// Within the Action class: fetch the request data, e.g. from a JSON request
$data = (array)$request->getParsedBody();

// Within the Application Service class: Do the validation
$validationFactory = new CakeValidationFactory();
$validator = $validationFactory->createValidator();

$validator
    ->notEmptyString('username', 'Input required')
    ->notEmptyString('password', 'Input required');

$validationResult = $validationFactory->createValidationResult(
    $validator->validate($data)
);

if ($validationResult->fails()) {
    throw new ValidationException('Please check your input', $validationResult);
}

请注意:应该通过构造函数注入CakeValidationFactory

阅读更多: https://odan.github.io/2020/10/18/slim4-cakephp-validation.html

转换器

如果你想实现自定义响应数据结构,可以实现一个针对\Selective\Validation\Transformer\ResultTransformerInterface接口的自定义转换器。

示例

<?php

namespace App\Transformer;

use Selective\Validation\Exception\ValidationException;
use Selective\Validation\Transformer\ResultTransformerInterface;
use Selective\Validation\ValidationResult;

final class MyValidationTransformer implements ResultTransformerInterface
{
    public function transform(
        ValidationResult $validationResult, 
        ValidationException $exception = null
    ): array {
        // Implement your own data structure for the response
        // ...

        return [];
    }
}

许可

MIT许可(MIT)。请参阅许可文件获取更多信息。