【PHP】ThinkPHP6.1 参数验证中间件

小破孩
2025-03-13 / 0 评论 / 7 阅读 / 正在检测是否收录...
    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);
    }
0

评论

博主关闭了所有页面的评论