odan/validation

此包已被废弃,不再维护。作者建议使用 selective/validation 包。

验证错误收集器和转换器

2.0.0 2021-09-04 23:02 UTC

This package is auto-updated.

Last update: 2022-02-01 13:13:09 UTC


README

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

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

目录

要求

  • PHP 7.2+ 或 8.0+

安装

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)。有关更多信息,请参阅许可文件