内容简介:写api接口时一般会在控制器中简单验证参数的正确性。使用yii只带验证器(因为比较熟悉)实现有两种方式(效果都不佳)。有么有“一劳永逸”的做法,像在
写api接口时一般会在控制器中简单验证参数的正确性。
使用yii只带验证器(因为比较熟悉)实现有两种方式(效果都不佳)。
-
针对每个请求单独写个
Model, 定义验证规则并进行验证。 缺点:写好多参数验证的Model类。 -
使用 独立验证器
中提到的
$validator->validateValue()方法直接验证变量值。缺点:写实例化很多验证器对象。
有么有“一劳永逸”的做法,像在 Model
中通过 rules
方法定义验证规则并实现快速验证的呢?有!
使用方法(实现效果)
namespace frontend\controllers\api;
use yii\web\Controller;
use common\services\app\ParamsValidateService;
class ArticleController extends Controller
{
// 文章列表
public function actionList()
{
$PVS = new ParamsValidateService();
$valid = $PVS->validate(\Yii::$app->request->get(), [
['category_id', 'required'],
['category_id', 'integer'],
['keyword', 'string'],
]);
if (!$valid) {
$this->apiError(1001, $PVS->getErrorSummary(true));
}
//...
}
// 新增文章
public function actionPost()
{
$PVS = new ParamsValidateService();
$valid = $PVS->validate(\Yii::$app->request->get(), [
[['category_id', 'title', 'content'], 'required'],
['category_id', 'integer'],
[['title'], 'string', 'max' => 64],
[['content'], 'string'],
]);
if (!$valid) {
$this->apiError(1001, $PVS->getErrorSummary(true));
}
//...
}
// 文章删除
public function actionDelete()
{
$PVS = new ParamsValidateService();
$valid = $PVS->validate(\Yii::$app->request->get(), [
['article_id', 'required'],
['article_id', 'integer'],
]);
if (!$valid) {
$this->apiError(1001, $PVS->getErrorSummary(true));
}
//...
}
}
实现方法
定义参数验证模型
定义参数验证模型 ParamsValidateModel
,继承 yii\db\ActiveRecord
,重写 attributes()
方法,主要功能:
- 验证规则可从对象外部进行设置。
- 从验证规则中获取可赋值的属性。
<?php
namespace common\models\app;
use yii\db\ActiveRecord;
class ParamsValidateModel extends ActiveRecord
{
/**
* @var array 验证规则
*/
private $_rules = [];
private $_attributes = [];
// 设置验证规则
public function setRules($rules)
{
$this->_rules = $rules;
foreach ($rules as $item) {
$this->_attributes = array_unique(array_merge($this->_attributes, (array)$item[0]));
}
}
// 重写获取验证规则
public function rules()
{
return $this->_rules;
}
// 设置可用属性列表
public function attributes()
{
return $this->_attributes;
}
}
定义参数验证服务类
定义参数验证服务类,主要功能有:
- 设置参数列表和参数规则列表。
- 使用 参数验证模型 进行验证和存储验证错误消息。
- 使用魔术方法获取 参数验证模型 中的验证错误消息。
<?php
namespace common\services\app;
use common\models\app\ParamsValidateModel;
use yii\base\Component;
/**
* Class ParamsValidateService
* @package common\services\app
* @method array getErrors(\string $attribute)
* @method array getFirstErrors()
* @method array getFirstError(\string $attribute)
* @method array getErrorSummary(\boolean $showAllErrors)
*/
class ParamsValidateService extends Component
{
/**
* @var ParamsValidateModel 模型
*/
private $model = null;
public function init()
{
parent::init();
$this->model = new ParamsValidateModel();
}
/**
* @param array $data 数据项
* @param array $rules 验证规则
* @return bool
*/
public function validate($data, $rules)
{
// 添加验证规则
$this->model->setRules($rules);
// 设置参数
$this->model->load($data, '');
// 进行验证
return $this->model->validate();
}
public function __call($name, $params)
{
if ($this->model->hasMethod($name)) {
return call_user_func_array([$this->model, $name], $params);
} else {
return parent::__call($name, $params);
}
}
}
以上所述就是小编给大家介绍的《yii2 在控制器中验证请求参数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- SpringMVC中的注解式控制器(一)——请求映射规则
- 老王,Laravel 的请求怎么一步步到达控制器的?
- 跟控制器说再见吧,从今天开始使用请求处理器(Request Handlers) 范式
- iOS之导航返回上上个控制器或指定返回某个控制器
- iOS小技巧·把子视图控制器的视图添加到父视图控制器
- javascript – AngularJS控制器错误 – :$http.get不是控制器部分的函数
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Don't Make Me Think
Steve Krug / New Riders Press / 18 August, 2005 / $35.00
Five years and more than 100,000 copies after it was first published, it's hard to imagine anyone working in Web design who hasn't read Steve Krug's "instant classic" on Web usability, but people are ......一起来看看 《Don't Make Me Think》 这本书的介绍吧!