中间件 +request validator 组合验证接口数据,怎么实现?
在写接口的时候,基础字段其实是固定的,这个时候,如果还要在每个接口的数据验证中,去重复的写基础字段的验证,真的是很累很麻烦
然后就想,能不能在中间件中,统一来验证呢?
请求数据:
{
"appid": "m60",
"nonce_str": "51ad4b447724b4cb0c9cdd225911b016",
"sign": "7299466b424c755121a5d311385ad1ba",
"body": "[{\"goods_name\": \"1602\",\"goods\": \"1602_T3171205831\",\"data\":[{\"gbCode\":\"6922045339140\",\"actQty\":\"3\"},{\"gbCode\":\"6922045339225\",\"actQty\":\"5\"}]}]",
"timestamp": "1525845577",
"sign_type": "MD5"
}
方案一:
// 验证规则:
namespace App\Http\Requests\Api;
use App\Logic\ApiRequest;
class BaseRequest extends ApiRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'appid' => 'required',
'timestamp' => 'required',
'nonce_str' => 'required',
'sign' => 'required',
'body' => 'required',
];
}
}
// 中间件中的handle代码:
public function handle(BaseRequest $request, Closure $next)
{
return $next($request);
}
但是这种用法是失败的,直接报错:
Type error: Argument 1 passed to App\Http\Middleware\ApiCheck::handle() must be an instance of App\Http\Requests\Api\BaseRequest, instance of Illuminate\Http\Request given, called in /Users/username/Valet/pinkr/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php on line 149
于是,就换了另一种方式,方案二:
// 中间件中的代码,也只需要这点儿代码:
public function handle($request, Closure $next)
{
$msg = config('apiFormMsg');
$rules = [
'appid' => 'required',
'timestamp' => 'required',
'nonce_str' => 'required',
'sign' => 'required',
'body' => 'required',
];
$messages = [
'appid.required' => $msg['required']['appid'],
'timestamp.required' => $msg['required']['timestamp'],
'nonce_str.required' => $msg['required']['nonce_str'],
'sign.required' => $msg['required']['sign'],
'body.required' => $msg['required']['body'],
];
$validator = Validator::make(json_decode($request->getContent(), true), $rules, $messages);
if ($validator->fails()) {
return $this->dataFormat(407, $validator->messages());
}
return $next($request);
}
希望有更好的实现方式,可以替换掉方案二的代码,求分享,谢谢!
推荐文章: