天天看點

ThinkPHP6項目基操(4.攔截無效請求 控制器或方法不存在)

攔截無效請求 控制器或方法不存在

    • 一、預設無效請求
    • 二、顯示具體錯誤資訊
      • 方法1.配置`config/app.php`
      • 方法2. 配置`.env`環境變量
    • 三、處理錯誤
      • 1. 方法不存在
      • 2. 控制器不存在

一、預設無效請求

當通路不存在的控制器或方法時,預設會顯示如下頁面:

ThinkPHP6項目基操(4.攔截無效請求 控制器或方法不存在)

二、顯示具體錯誤資訊

方法1.配置

config/app.php

如果想看具體的錯誤資訊可以配置

config/app.php

配置後顯示具體錯誤資訊:

ThinkPHP6項目基操(4.攔截無效請求 控制器或方法不存在)

方法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.攔截無效請求 控制器或方法不存在)

線上模式,我們設定

APP_DEBUG = false

,這時候又會回到剛才的錯誤頁面:

ThinkPHP6項目基操(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.攔截無效請求 控制器或方法不存在)

2. 控制器不存在

當通路一個不存在的控制器時,也是顯示如下報錯:

ThinkPHP6項目基操(4.攔截無效請求 控制器或方法不存在)

解決方法,在

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);
    }
}
           

這時再通路不存在的控制器:

ThinkPHP6項目基操(4.攔截無效請求 控制器或方法不存在)

⭐️重磅推薦:免費商用電商系統

😏想白嫖整個電商系統用來商用?

🤑想有自己的商城實作财富自由?

🤓想學習最佳實踐提升自己技術?

快來進入🚀 傳送門 🚀,開源免費、完整示例帶你快速入門,輕松二開,走上人生巅峰!👨‍🎓

ThinkPHP6項目基操(4.攔截無效請求 控制器或方法不存在)