#### 1. 什么是空控制器 --- 空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位当前应用下的空控制器(Error)类,开发者可以利用这个机制来定制错误页面和进行URL的优化。 #### 2. 应用场景 ---- 举例: 当访问 **/user/getMine** 时,如果 user 控制器不存在,框架默认会直接抛出错误 开启调试模式时会抛出异常: **控制器不存在:app\controller\User**,此时可以通过自定义异常处理机制使其返回 **json 数据格式** 但是当关闭调试模式会提示: **页面错误!请稍后再试~**,对于专门提供接口的 api 应用来说, 接口应该始终返回 json 数据,而不是 **页面错误!请稍后再试~** 这样一个页面,因为没有异常抛出,所以此时使用自定义异常处理机制也无法使其返回 json 数据 使用框架的空控制器可以解决这个问题,使 **api 应用** 始终返回 json 数据格式,单应用和多应用模式都支持空控制器。 **创建空控制器** ```php // 单应用模式 php think make:controller Error --plain // 多应用模式 php think make:controller api@Error --plain ``` 使用魔术方法 `__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) 请求示例 ![](https://img.itqaq.com/art/content/74ce45791a39d3b0a8353cdc6d89acd6.png)