public function handle($request, \Closure $next)
{
try {
// 获取并清理参数
$params = array_filter(array_map(function ($value) {
return is_string($value) ? trim($value) : $value;
}, $request->param()), function ($value) {
return is_numeric($value) || !empty($value);
});
unset($params['controller'], $params['function']);
if (empty($params)) return $next($request);
// 设置请求属性,方便后续使用
$request->checkParam = $params;
// 获取应用名、控制器和操作名
$appName = app('http')->getName();
$controller = Request::instance()->controller(true);
$action = Request::instance()->action(true);
// 动态构建验证器路径
$controllerParts = explode('.', $controller);
$validatePathParts = array_merge([$appName, 'validate'], $controllerParts);
$validatePath = implode('\\', array_map('ucfirst', $validatePathParts));
// 检查验证器是否存在及场景是否定义
if (!class_exists($validatePath) || !$this->sceneExists($validatePath, $action)) {
return $next($request);
}
// 验证数据
$validateInstance = new $validatePath;
if (!$validateInstance->scene($action)->check($params)) {
throw new Exception($validateInstance->getError());
}
} catch (Exception $e) {
return show(100, $e->getMessage());
}
return $next($request);
}
/**
* 检查指定验证场景是否存在
*
* @param string $validateClass 验证类名
* @param string $scene 场景名
* @return bool
*/
protected function sceneExists(string $validateClass, string $scene): bool
{
return (new $validateClass)->hasScene($scene);
}
版权属于:
小破孩
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
评论