framework icon indicating copy to clipboard operation
framework copied to clipboard

Session 未初始化时使用 Request::has() 会报错

Open big-dream opened this issue 3 years ago • 0 comments

Request::has('name', 'session') 只是检测指定 Session 是否存在,如果得初始化 Session 之后才能使用的话,感觉不大友好。

相当于使用Request::has('name', 'session') 前就得判断下Session,或者使用Session::has('name')来判断,这时候Request::has()方法就失去了它的便利性和统一化。

希望能优化下这块,如果没初始化Session则直接返回false即可,而不是直接报错。


错误流程跟踪

未初始化Session,所以$this->sessionnull,转为调用$this->session()

    /**
     * 是否存在某个请求参数
     * @access public
     * @param  string $name 变量名
     * @param  string $type 变量类型
     * @param  bool   $checkEmpty 是否检测空值
     * @return bool
     */
    public function has(string $name, string $type = 'param', bool $checkEmpty = false): bool
    {
        if (!in_array($type, ['param', 'get', 'post', 'put', 'patch', 'route', 'delete', 'cookie', 'session', 'env', 'request', 'server', 'header', 'file'])) {
            return false;
        }

        $param = empty($this->$type) ? $this->$type() : $this->$type;

        if (is_object($param)) {
            return $param->has($name);
        }

        // 按.拆分成多维数组进行判断
        foreach (explode('.', $name) as $val) {
            if (isset($param[$val])) {
                $param = $param[$val];
            } else {
                return false;
            }
        }

        return ($checkEmpty && '' === $param) ? false : true;
    }

直接返回$this->session->all()的结果,但未初始化Session,所以$this->sessionnull,报Call to a member function all() on null错误

    /**
     * 获取session数据
     * @access public
     * @param  string $name 数据名称
     * @param  string $default 默认值
     * @return mixed
     */
    public function session(string $name = '', $default = null)
    {
        if ('' === $name) {
            return $this->session->all();
        }
        return $this->session->get($name, $default);
    }

本来想直接改成这样提交PR,但显然是不优雅的

    /**
     * 获取session数据
     * @access public
     * @param  string $name 数据名称
     * @param  string $default 默认值
     * @return mixed
     */
    public function session(string $name = '', $default = null)
    {
        if ('' === $name) {
            return null === $this->session ? [] : $this->session->all();
        }
        return null === $this->session ? $default : $this->session->get($name, $default);
    }

还想着不初始化也withSession()一个空的Session,但又觉得会不会增加不必要的流程和内存占用。

big-dream avatar Jan 05 '22 10:01 big-dream