ginkgo


空控制器

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

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

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

变成

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

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

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

namespace app\ctrl\index;

use ginkgo\Request;

class C_Empty {
    public function index() {
        // 获取原始路由
        $routeOrig = Request::instance()->routeOrig();

        // 取得原始控制器名
        $name = $routeOrig['ctrl']

        // 根据当前控制器名来判断要执行那个城市的操作
        return $this->showCity($name);
    }

    // 注意 showCity 方法 本身是 protected 方法
    protected function showCity($name) {
        // 和 $name 这个城市相关的处理
        return '当前城市:' . $name;
    }
}

控制器的实际位置是

app/ctrl/index/c_empty.ctrl.php

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

  • http://server/index.php/index/beijing/
  • http://server/index.php/index/shanghai/
  • http://server/index.php/index/shenzhen/

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

当前城市:beijing
当前城市:shanghai
当前城市:shenzhen

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