selective / 验证
验证错误收集器和转换器
Requires
- php: ^8.1
- 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: ^3
- nyholm/psr7: ^1.4
- phpstan/phpstan: ^1
- phpunit/phpunit: ^10
- relay/relay: ^2.0
- slim/psr7: ^1
- squizlabs/php_codesniffer: ^3
README
这是一个使用通知模式的PHP验证库。
目录
要求
- 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\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)。请参阅许可文件获取更多信息。