davidepastore / slim-validation
基于 Respect/Validation 的轻量级验证中间件
v4.0.0
2022-12-19 20:12 UTC
Requires
- php: ^7.2
- psr/http-message: ^1.0
- respect/validation: ^1.1 >=1.1.23
- slim/http: ^1.1
- slim/psr7: ^0.3|^1.6
Requires (Dev)
- phpunit/phpunit: ^8.0
- scrutinizer/ocular: 1.5.*
- slim/slim: ~4.0
This package is auto-updated.
Last update: 2024-08-29 03:42:02 UTC
README
为 Slim 框架提供的验证库。它内部使用 Respect/Validation。
目录
安装
通过 Composer
$ composer require davidepastore/slim-validation
需要 Slim 4.0.0 或更高版本。
使用
在大多数情况下,您可能希望为单个路由注册 DavidePastore\Slim\Validation
,但由于它是中间件,您也可以为所有路由注册它。
按路由注册
use Respect\Validation\Validator as v; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); //Create the validators $usernameValidator = v::alnum()->noWhitespace()->length(1, 10); $ageValidator = v::numeric()->positive()->between(1, 20); $validators = array( 'username' => $usernameValidator, 'age' => $ageValidator ); $app->get('/api/myEndPoint',function ($req, $res, $args) { //Here you expect 'username' and 'age' parameters if($req->getAttribute('has_errors')){ //There are errors, read them $errors = $req->getAttribute('errors'); /* $errors contains: array( 'username' => array( '"davidepastore" must have a length between 1 and 10', ), 'age' => array( '"89" must be lower than or equals 20', ), ); */ } else { //No errors } })->add(new \DavidePastore\Slim\Validation\Validation($validators)); $app->run();
对所有路由注册
use Respect\Validation\Validator as v; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); //Create the validators $usernameValidator = v::alnum()->noWhitespace()->length(1, 10); $ageValidator = v::numeric()->positive()->between(1, 20); $validators = array( 'username' => $usernameValidator, 'age' => $ageValidator ); // Register middleware for all routes // If you are implementing per-route checks you must not add this $app->add(new \DavidePastore\Slim\Validation\Validation($validators)); $app->get('/foo', function ($req, $res, $args) { //Here you expect 'username' and 'age' parameters if($req->getAttribute('has_errors')){ //There are errors, read them $errors = $req->getAttribute('errors'); /* $errors contains: array( 'username' => array( '"davidepastore" must have a length between 1 and 10', ), 'age' => array( '"89" must be lower than or equals 20', ), ); */ } else { //No errors } }); $app->post('/bar', function ($req, $res, $args) { //Here you expect 'username' and 'age' parameters if($req->getAttribute('has_errors')){ //There are errors, read them $errors = $req->getAttribute('errors'); } else { //No errors } }); $app->run();
路由参数
use Respect\Validation\Validator as v; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); //Create the validators $routeParamValidator = v::numeric()->positive(); $validators = array( 'param' => $routeParamValidator, ); $app->get('/foo/{param}', function ($req, $res, $args) { //Here you expect 'param' route parameter if($req->getAttribute('has_errors')){ //There are errors, read them $errors = $req->getAttribute('errors'); /* $errors contains: array( 'param' => array( '"wrong" must be numeric', ), ); */ } else { //No errors } })->add(new \DavidePastore\Slim\Validation\Validation($validators)); $app->run();
请注意,请求参数优先于路由参数,因此如果路由参数和请求参数名称相同,则最后一个将获胜,并用于验证。
JSON 请求
您还可以验证 JSON 请求。假设您的请求体如下
{ "type": "emails", "objectid": "1", "email": { "id": 1, "enable_mapping": "1", "name": "rq3r", "created_at": "2016-08-23 13:36:29", "updated_at": "2016-08-23 14:36:47" } }
并且您想验证 email.name
键。您可以通过这种方式进行
use Respect\Validation\Validator as v; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); //Create the validators $typeValidator = v::alnum()->noWhitespace()->length(3, 5); $emailNameValidator = v::alnum()->noWhitespace()->length(1, 2); $validators = array( 'type' => $typeValidator, 'email' => array( 'name' => $emailNameValidator, ), );
如果您出错,结果将是
//In your route $errors = $req->getAttribute('errors'); print_r($errors); /* Array ( [email.name] => Array ( [0] => "rq3r" must have a length between 1 and 2 ) ) */
XML 请求
您还可以验证 XML 请求。假设您的请求体如下
假设您有一个包含 XML 的 POST 请求
<person> <type>emails</type> <objectid>1</objectid> <email> <id>1</id> <enable_mapping>1</enable_mapping> <name>rq3r</name> <created_at>2016-08-23 13:36:29</created_at> <updated_at>2016-08-23 14:36:47</updated_at> </email> </person>
并且您想验证 email.name
键。您可以通过这种方式进行
use Respect\Validation\Validator as v; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); //Create the validators $typeValidator = v::alnum()->noWhitespace()->length(3, 5); $emailNameValidator = v::alnum()->noWhitespace()->length(1, 2); $validators = array( 'type' => $typeValidator, 'email' => array( 'name' => $emailNameValidator, ), );
如果您出错,结果将是
//In your route $errors = $req->getAttribute('errors'); print_r($errors); /* Array ( [email.name] => Array ( [0] => "rq3r" must have a length between 1 and 2 ) ) */
错误翻译
您可以为错误翻译提供一个可调用的函数。
use Respect\Validation\Validator as v; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); //Create the validators $usernameValidator = v::alnum()->noWhitespace()->length(1, 10); $ageValidator = v::numeric()->positive()->between(1, 20); $validators = array( 'username' => $usernameValidator, 'age' => $ageValidator ); $translator = function($message){ $messages = [ 'These rules must pass for {{name}}' => 'Queste regole devono passare per {{name}}', '{{name}} must be a string' => '{{name}} deve essere una stringa', '{{name}} must have a length between {{minValue}} and {{maxValue}}' => '{{name}} deve avere una dimensione di caratteri compresa tra {{minValue}} e {{maxValue}}', ]; return $messages[$message]; }; $middleware = new \DavidePastore\Slim\Validation\Validation($validators, $translator); // Register middleware for all routes or only for one... $app->run();
测试
$ vendor\bin\phpunit
贡献
有关详细信息,请参阅 CONTRIBUTING。