flsouto / param
用于验证和过滤任何输入源的酷API
Requires
- flsouto/pipe: ^1.0
This package is not auto-updated.
Last update: 2024-09-23 13:13:11 UTC
README
概述
此库允许您从关联数组中提取、过滤和验证单个字段。例如,它可以用于验证从网页浏览器发送的请求变量。您为每个参数提供一个“名称”,定义“上下文”,然后调用“process”;结果将是上下文中提取的值或不符合一个或多个验证过滤器时的错误消息。许多预定义的过滤器和验证器都可通过“友好”的API获得。您还可以指定在验证失败时返回的回退值。
安装
通过composer安装
composer require flsouto/param
用法
以下示例创建一个参数并打印其名称
<?php use FlSouto\Param; require_once('vendor/autoload.php'); $param = new Param('test'); echo $param->name();
test
您可以从静态 get 方法实例化参数,该方法始终为该名称返回相同的实例
use FlSouto\Param; $param1 = Param::get('country'); $param2 = Param::get('country'); var_dump($param1===$param2);
输出将如下
bool(true)
处理输入
process 实例方法接收一个“上下文”,它必须是一个关联数组,并尝试根据参数名称提取参数值。
use FlSouto\Param; $param = Param::get('user_id'); $result = $param->process(['user_id'=>5]); echo $result->output;
上述输出的结果将如下
5
预定义上下文
您可以在调用process方法之前在参数实例上设置上下文
use FlSouto\Param; $param = Param::get('language'); $param->context([ 'var1' => '...', 'var2' => '...', 'language' => 'en' ]); $result = $param->process(); echo $result->output;
en
如果您想设置上下文并在以后修改它,我建议您提供一个类似于以下示例的ArrayObject实例
use FlSouto\Param; $context = new ArrayObject; $param = Param::get('lang_code'); $param->context($context); // modify context later $context['lang_code'] = 'en'; $result = $param->process(); echo $result->output;
en
此外,您还可以使用 ParamContext 类,它允许您从预定义的上下文中创建参数。更多关于此的内容请参阅“ParamContext”部分。
命名空间参数
您可以使用方括号来指定全限定名称。在以下示例中,参数 'email' 在层次结构 user > contact 中找到
use FlSouto\Param; $param = Param::get('user[contact][email]'); $param->context([ 'user' => [ 'contact' => [ 'email' => 'user@domain.com' ] ] ]); $result = $param->process(); echo $result->output;
上述输出的结果将如下
user@domain.com
验证
参数对象使用 Pipe 类的实例,该类允许将一系列过滤器/验证器绑定到数据
use FlSouto\Param; $param = Param::get('user'); $param->pipe()->add('trim')->add(function($value){ if(empty($value)){ echo 'Cannot be empty'; } }); $result = $param->process(['user'=>' ']); echo $result->error;
输出
Cannot be empty
上述片段添加了一个过滤参数值并添加了一个如果最终值为空则产生错误的验证器。然后捕获打印的错误消息在 $result->error 属性中。
注意:Param类实际上通过ParamFiltersAPI提供了一组常用的过滤器和验证器。更多关于此的内容请参阅“ParamFilters API”部分。
回退值
您可以在$result->output中指定一个回退值,在验证失败时返回。
use FlSouto\Param; $param = Param::get('lang'); $param->fallback('en'); $param->pipe()->add(function($value){ if(empty($value)){ echo 'No language selected'; } }); // pass an empty context $result = $param->process([]); echo $result->output;
输出将如下
en
设置默认值
此库提供了静态setup方法,允许您在创建所有参数实例时拦截。以下示例中,我们为我们的应用程序中每个参数定义默认上下文为$_REQUEST超全局变量,并设置所有参数默认为被修剪
use FlSouto\Param; // place this in a global bootstrap script Param::setup(function(Param $param){ $param->context($_REQUEST)->filters()->trim(); }); // Processing some request $_REQUEST = ['name'=>'Fabio ','age'=>' 666 ']; $name = (new Param('name'))->process()->output; $age = (new Param('age'))->process()->output; echo "$name is $age years old";
上述代码的输出将如下
Fabio is 666 years old
方法链
最后但同样重要的是,Param类的所有setter都返回实例本身,因此可以链式调用方法
<?php use FlSouto\Param; require_once('vendor/autoload.php'); $_REQUEST['lang'] = 'pt'; Param::get('lang') ->fallback('en') ->context($_REQUEST) ->pipe() ->add('trim') ->add(function($value){ if(empty($value)) echo 'Cannot be empty'; }); $result = Param::get('lang')->process();
ParamContext
ParamContext 允许您从预定义的上下文中创建参数。它实际上是对 ArrayObject 类的包装,可以跟踪添加的参数
<?php require_once('vendor/autoload.php'); use FlSouto\ParamContext; $context = new ParamContext(); $context->param('user_id'); $context->param('lang_code')->filters()->trim(); $context['user_id'] = 5; $context['lang_code'] = 'en '; $result = $context->process(); print_r($result->output);
输出将是一个关联数组,包含所有提取的参数
Array
(
[user_id] => 5
[lang_code] => en
)
您仍然可以处理单个参数并获取其输出
require_once('vendor/autoload.php'); use FlSouto\ParamContext; $context = new ParamContext(); $context->param('lang_code')->filters()->trim(); $context['lang_code'] = 'en '; // process individual param: $result = $context->param('lang_code')->process(); var_dump($result->output);
输出将如下
string(2) "en"
验证
如果发生任何错误,这些错误将作为关联数组存储在变量´$result->errors´中。
require_once('vendor/autoload.php'); use FlSouto\ParamContext; $context = new ParamContext(); $required = function($value){ if(empty($value)){ echo "Cannot be empty"; } }; $context->param('user_id')->pipe()->add($required); $context->param('user_name')->pipe()->add($required); $result = $context->process(); print_r($result->errors);
输出
Array
(
[user_id] => Cannot be empty
[user_name] => Cannot be empty
)
ParamFilters
Param类有一个实例方法filters,它返回一个ParamFilters实例。这个类使得过滤和验证数据的过程变得更加简单。
以下部分将专门介绍在该对象中使用每个方法的方法。
trim
从字符串的开始和结束处删除空格。
<?php require_once('vendor/autoload.php'); use FlSouto\Param; Param::get('name') ->filters() ->trim(); $result = Param::get('name')->process(['name'=>' maria ']); var_dump($result->output);
string(5) "maria"
replace
替换过滤器允许您用一个字符串替换另一个字符串,类似于php的str_replace函数
use FlSouto\Param; Param::get('money') ->context(['money'=>'3,50']) ->filters() ->replace(',','.'); $output = Param::get('money')->process()->output; var_dump($output);
string(4) "3.50"
使用正则表达式替换
如果将搜索模式括在两个斜杠之间,则假定它是一个正则表达式。
use FlSouto\Param; Param::get('file_name') ->context(['file_name'=>'My untitled document.pdf']) ->filters() ->replace('/\s+/', '-'); $output = Param::get('file_name')->process()->output; var_dump($output);
string(24) "My-untitled-document.pdf"
使用“i”修饰符的正则表达式示例
use FlSouto\Param; Param::get('style') ->context(['style'=>'CamelCase']) ->filters() ->replace('/camelcase/i', 'under_scores'); $output = Param::get('style')->process()->output; var_dump($output);
string(12) "under_scores"
strip
匹配字符串或正则表达式模式,并将其从字符串中删除
use FlSouto\Param; Param::get('name')->filters()->strip('/[^\d]/'); $result = Param::get('name')->process(['name'=>'f4b10']); var_dump($result->output);
string(3) "410"
required
确保值不为空。如果为空,则生成错误消息。
use FlSouto\Param; Param::get('name') ->context(['name'=>'']) ->filters() ->required("Cannot be empty"); $error = Param::get('name')->process()->error; var_dump($error);
string(15) "Cannot be empty"
所有验证器都有默认的错误消息,可以自定义。以下是重定义默认错误消息的示例
use FlSouto\Param; FlSouto\ParamFilters::$errmsg_required = 'Cannot be empty'; Param::get('name') ->context(['name'=>'']) ->filters() ->required(); $error = Param::get('name')->process()->error; var_dump($error);
string(15) "Cannot be empty"
ifmatch
当字符串与模式匹配时产生错误
use FlSouto\Param; Param::get('name') ->filters() ->ifmatch('/\d/', 'Name cannot contain digits'); $error = Param::get('name')->process(['name'=>'M4ry'])->error; var_dump($error);
string(26) "Name cannot contain digits"
使用正则表达式修饰符的另一个示例
use FlSouto\Param; Param::get('phone') ->filters() ->ifmatch('/[a-z]/i', 'Phone cannot contain letters'); $error = Param::get('phone')->process(['phone'=>'9829574K'])->error; var_dump($error);
string(28) "Phone cannot contain letters"
注意:此验证器仅在值不为空时应用
use FlSouto\Param; Param::get('phone') ->filters() ->ifmatch('/[a-z]/i', 'Phone cannot contain letters'); $error = Param::get('phone')->process(['phone'=>''])->error; var_dump($error);
NULL
如果您想确保值不为空,请在ifmatch之前使用required过滤器。
ifnot
当字符串不匹配模式时产生错误
use FlSouto\Param; Param::get('date')->filters()->ifnot('/^\d{4}-\d{2}-\d{2}$/','Date is expected to be in the format yyyy-mm-dd'); $error = Param::get('date')->process(['date'=>'10/12/1992'])->error; var_dump($error);
string(47) "Date is expected to be in the format yyyy-mm-dd"
注意:此验证器仅在值不为空时应用
use FlSouto\Param; Param::get('login')->filters()->ifnot('\w','Login must contain at least one letter'); $error = Param::get('login')->process([])->error; var_dump($error);
NULL
maxlen
确保字符串的长度不超过最大值
use FlSouto\Param; Param::get('description')->filters()->maxlen(30, "Description must be less than %d characters long!"); $error = Param::get('description') ->process(['description'=>str_repeat('lorem ipsum', 10)]) ->error; var_dump($error);
string(49) "Description must be less than 30 characters long!"
minlen
确保字符串的长度至少为特定字符数
use FlSouto\Param; Param::get('description')->filters()->minlen(10, "Description must be at least %d characters long!"); $error = Param::get('description')->process(['description'=>'Test'])->error; var_dump($error);
string(48) "Description must be at least 10 characters long!"
注意:此验证器仅在值不为空时应用
use FlSouto\Param; Param::get('description')->filters()->minlen(10, "Description must be at least %d characters long!"); $error = Param::get('description')->process(['description'=>''])->error; var_dump($error);
NULL
maxval
确保整数不超过特定值
use FlSouto\Param; Param::get('age')->filters()->maxval(150, "Age cannot be more than %d!"); $error = Param::get('age')->process(['age'=>200])->error; var_dump($error);
string(28) "Age cannot be more than 150!"
minval
确保整数,如果提供,至少大于X
use FlSouto\Param; Param::get('age')->filters()->minval(1, "Age cannot be less than %d!"); $error = Param::get('age')->process(['age'=>0])->error; var_dump($error);
string(26) "Age cannot be less than 1!"
注意:此验证器仅在值不为空时应用
use FlSouto\Param; Param::get('age')->filters()->minval(1, "Age cannot be less than %d!"); $error = Param::get('age')->process(['age'=>null])->error; var_dump($error);
NULL
链式过滤器
最后但同样重要的是,您可以使用方法链来添加多个过滤器。过滤器将按照添加的顺序应用于值
<?php require_once('vendor/autoload.php'); use FlSouto\Param; Param::get('number') ->filters() ->strip('/[^\d]/') ->required() ->minlen(5) ->maxlen(10); $result = Param::get('number')->process([ 'number' => '203-40-10/80' ]); var_dump($result->output);
在上面的示例中,数据将在验证约束之前进行过滤,结果将是
string(9) "203401080"