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

一、默认无效请求

当访问不存在的控制器或方法时,默认会显示如下页面:
在这里插入图片描述

二、显示具体错误信息

方法1.配置config/app.php

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

'show_error_msg'   => true

配置后显示具体错误信息:
在这里插入图片描述

方法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模式,这时候再访问刚才的地址,可以看到非常详细的报错,

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

在这里插入图片描述
线上模式,我们设置APP_DEBUG = false,这时候又会回到刚才的错误页面:
在这里插入图片描述

三、处理错误

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插件

在这里插入图片描述

2. 控制器不存在

当访问一个不存在的控制器时,也是显示如下报错:
在这里插入图片描述
解决方法,在app\controller目录下新建一个Error控制器(名字固定为Error)

<?php

namespace app\controller;

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

这时再访问不存在的控制器:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zy1281539626/article/details/110307960