odan / validation
Requires
- php: ^7.2 || ^8.0
- ext-json: *
- psr/http-factory: ^1.0.1
- psr/http-server-middleware: ^1.0.1
Requires (Dev)
- cakephp/validation: ^4.2
- fig/http-message-util: ^1.1
- friendsofphp/php-cs-fixer: ^2.16
- nyholm/psr7: ^1.4
- overtrue/phplint: ^1.1
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^8 || ^9
- relay/relay: ^2.0
- slim/psr7: ^1
- squizlabs/php_codesniffer: ^3.5
README
这是一个使用 通知模式 的 PHP 验证库。
目录
要求
- 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\CakeValidationFactory
或 Selective\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)。有关更多信息,请参阅许可文件。