空控制器

空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器 C_Empty,利用这个机制,可以用来定制错误页面和进行 URL 的优化。

现在把前面的需求进一步,把 URL 由原来的

http://server/index.php/index/city/shanghai/

变成

http://server/index.php/index/shanghai/

这样更加简单的方式,如果按照传统的模式,必须给每个城市定义一个控制器类,然后在每个控制器类的 index 方法里面进行处理。可是如果使用空控制器功能,这个问题就可以迎刃而解了。

可以给项目定义一个 C_Empty 控制器类

  1. namespace app\ctrl\index;
  2. use ginkgo\Request;
  3. class C_Empty {
  4. public function index() {
  5. // 获取原始路由
  6. $routeOrig = Request::instance()->routeOrig();
  7. // 取得原始控制器名
  8. $name = $routeOrig['ctrl']
  9. // 根据当前控制器名来判断要执行那个城市的操作
  10. return $this->showCity($name);
  11. }
  12. // 注意 showCity 方法 本身是 protected 方法
  13. protected function showCity($name) {
  14. // 和 $name 这个城市相关的处理
  15. return '当前城市:' . $name;
  16. }
  17. }

控制器的实际位置是

app/ctrl/index/c_empty.ctrl.php

接下来,可以在浏览器里面输入

由于系统并不存在 beijing、shanghai 或者shenzhen 控制器,因此会定位到空控制器 C_Empty 去执行,会看到依次输出的结果是:

  1. 当前城市:beijing
  2. 当前城市:shanghai
  3. 当前城市:shenzhen

空控制器和空操作还可以同时使用,用以完成更加复杂的操作。