#### 1. 什么是空控制器 --- 空控制器的概念是指當(dāng)系統(tǒng)找不到指定的控制器名稱的時(shí)候,系統(tǒng)會(huì)嘗試定位當(dāng)前應(yīng)用下的空控制器(Error)類,開(kāi)發(fā)者可以利用這個(gè)機(jī)制來(lái)定制錯(cuò)誤頁(yè)面和進(jìn)行URL的優(yōu)化。 #### 2. 應(yīng)用場(chǎng)景 ---- 舉例: 當(dāng)訪問(wèn) **/user/getMine** 時(shí),如果 user 控制器不存在,框架默認(rèn)會(huì)直接拋出錯(cuò)誤 開(kāi)啟調(diào)試模式時(shí)會(huì)拋出異常: **控制器不存在:app\controller\User**,此時(shí)可以通過(guò)自定義異常處理機(jī)制使其返回 **json 數(shù)據(jù)格式** 但是當(dāng)關(guān)閉調(diào)試模式會(huì)提示: **頁(yè)面錯(cuò)誤!請(qǐng)稍后再試~**,對(duì)于專門(mén)提供接口的 api 應(yīng)用來(lái)說(shuō), 接口應(yīng)該始終返回 json 數(shù)據(jù),而不是 **頁(yè)面錯(cuò)誤!請(qǐng)稍后再試~** 這樣一個(gè)頁(yè)面,因?yàn)闆](méi)有異常拋出,所以此時(shí)使用自定義異常處理機(jī)制也無(wú)法使其返回 json 數(shù)據(jù) 使用框架的空控制器可以解決這個(gè)問(wèn)題,使 **api 應(yīng)用** 始終返回 json 數(shù)據(jù)格式,單應(yīng)用和多應(yīng)用模式都支持空控制器。 **創(chuàng)建空控制器** ```php // 單應(yīng)用模式 php think make:controller Error --plain // 多應(yīng)用模式 php think make:controller api@Error --plain ``` 使用魔術(shù)方法 `__call` ``` public function __call($method, $args) { $controller = request()->controller(); $action = request()->action(); return json(['code' => 400, 'msg' => "{$controller} 控制器 {$action} 方法不存在"]); } ``` 代碼示例 ![](https://img.itqaq.com/art/content/d70deb65c34eb40a20235316c495c549.png) 請(qǐng)求示例 ![](https://img.itqaq.com/art/content/74ce45791a39d3b0a8353cdc6d89acd6.png)