ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)

拦截无效请求 控制器或方法不存在

    • 一、默认无效请求
    • 二、显示具体错误信息
      • 方法1.配置`config/app.php`
      • 方法2. 配置`.env`环境变量
    • 三、处理错误
      • 1. 方法不存在
      • 2. 控制器不存在

一、默认无效请求

当访问不存在的控制器或方法时,默认会显示如下页面:
ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第1张图片

二、显示具体错误信息

方法1.配置config/app.php

如果想看具体的错误信息可以配置config/app.php

'show_error_msg'   => true

配置后显示具体错误信息:
ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第2张图片

方法2. 配置.env环境变量

将方法1的配置还原;然后看下项目根目录有个文件.example.env,这是官方提供的env示例文件,可以将它复制一份,然后重命名为.env文件,默认文件内容如下:

APP_DEBUG = true

[APP]
DEFAULT_TIMEZONE = Asia/Shanghai

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = test
USERNAME = username
PASSWORD = password
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true

[LANG]
default_lang = zh-cn

可以看到第一行APP_DEBUG = true默认开启了debug模式,这时候再访问刚才的地址,可以看到非常详细的报错,

注意:这种模式是开发阶段才能打开的,线上模式是不能打开的,因为会暴露详细的文件和信息流程,非常不安全。

ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第3张图片
线上模式,我们设置APP_DEBUG = false,这时候又会回到刚才的错误页面:
ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第4张图片

三、处理错误

1. 方法不存在

BaseController控制器中定义__call方法,如果访问的控制器继承了BaseController控制器,而方法找不到会进入这个__call方法,需要注意的是访问的方法可能是API格式的json数据,也可能是返回页面,如果是api数据:

public function __call($name, $arguments)
{
     
    // 如果是API模块,需要输出API的数据格式(一般是json)
    // 如果是模板引擎的方式,需要输出自定义错误页面
    $result = [
        'status' => 0,
        'message' => '找不到该方法',
        'result' => null
    ];
    return json($result, 400);
}

当我们访问不存在的方法时:

下图显示格式化的json数据格式,是因为浏览器安装了JSONView插件

ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第5张图片

2. 控制器不存在

当访问一个不存在的控制器时,也是显示如下报错:
ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第6张图片
解决方法,在app\controller目录下新建一个Error控制器(名字固定为Error)



namespace app\controller;

class Error
{
     
    public function __call($name, $arguments)
    {
     
        $result = [
            'status' => 0,
            'message' => '找不到该控制器',
            'result' => null
        ];
        return json($result, 400);
    }
}

这时再访问不存在的控制器:
ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)_第7张图片

你可能感兴趣的:(thinkphp,thinkphp,tp6,php,thinkphp6.0)