ginkgo


分层控制器

ginkgo 引入了分层控制器的概念

访问控制器

能够通过 URL 访问的称之为访问控制器,此前所说的控制器一般都是指访问控制器,访问控制器是由 ginkgo\App 类负责调用和实例化的,无需手动实例化。

URL 解析和路由后,会把当前的 URL 地址解析到 【模块 / 控制器 / 动作】,其实也就是执行某个控制器类的某个动作,下面是一个示例:

namespace app\ctrl\index;

class Blog {
    public function index() {
        return 'index';
    }

    public function add() {
        return 'add';
    }

    public function edit($param) {
        return 'edit:' . $param['id'];
    }
}

控制器的实际位置是

app/ctrl/index/blog.ctrl.php

当前定义的主控制器位于 index 模块下面,所以当访问不同的 URL 地址的页面:

  • http://server/index.php/index/blog/index
  • http://server/index.php/index/blog/add
  • http://server/index.php/index/blog/edit/id/5

输出如下:

index
add
edit:5

分层控制器

除了访问控制器外,还可以定义分层控制器类,分层控制器是不能够被 URL 访问直接调用的,只能在访问控制器、模型的内部,或者模板中进行调用。

例如,定义 index 模块 event 层下的 Blog 控制器如下:

namespace app\ctrl\index\event;

class Blog {
    public function insert() {
        return 'insert';
    }

    public function update($param) {
        return 'update:' . $param['id'];
    }

    public function delete($param) {
        return 'delete:' . $param['id'];
    }
}

控制器的实际位置是

app/ctrl/index/event/blog.ctrl.php

定义完成后,就可以用下面的方式实例化并调用方法了:

use ginkgo\Loader

$event = Loader::ctrl('Blog', 'event');
echo $event->update(5);
echo $event->delete(5);

输出如下:

update:5
delete:5

跨模块调用

控制器支持跨模块调用,例如:

use ginkgo\Loader

$event = Loader::ctrl('Blog', '', 'admin');
echo $event->update(5);

控制器的实际位置是

app/ctrl/admin/blog.ctrl.php

输出如下:

update:5

表示实例化 admin 模块的 Blog 控制器类,并执行 update 方法。

use ginkgo\Loader

$event = Loader::ctrl('Blog', 'event', 'admin');
echo $event->update(5);

控制器的实际位置是

app/ctrl/admin/event/blog.ctrl.php

输出如下:

update:5

表示实例化 admin 模块的 event 层下的 Blog 控制器类,并执行 update 方法。