分层控制器

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

访问控制器

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

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

  1. namespace app\ctrl\index;
  2. class Blog {
  3. public function index() {
  4. return 'index';
  5. }
  6. public function add() {
  7. return 'add';
  8. }
  9. public function edit($param) {
  10. return 'edit:' . $param['id'];
  11. }
  12. }

控制器的实际位置是

app/ctrl/index/blog.ctrl.php

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

输出如下:

  1. index
  2. add
  3. edit:5

分层控制器

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

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

  1. namespace app\ctrl\index\event;
  2. class Blog {
  3. public function insert() {
  4. return 'insert';
  5. }
  6. public function update($param) {
  7. return 'update:' . $param['id'];
  8. }
  9. public function delete($param) {
  10. return 'delete:' . $param['id'];
  11. }
  12. }

控制器的实际位置是

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

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

  1. use ginkgo\Loader
  2. $event = Loader::ctrl('Blog', 'event');
  3. echo $event->update(5);
  4. echo $event->delete(5);

输出如下:

  1. update:5
  2. delete:5

跨模块调用

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

  1. use ginkgo\Loader
  2. $event = Loader::ctrl('Blog', '', 'admin');
  3. echo $event->update(5);

控制器的实际位置是

app/ctrl/admin/blog.ctrl.php

输出如下:

  1. update:5

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

  1. use ginkgo\Loader
  2. $event = Loader::ctrl('Blog', 'event', 'admin');
  3. echo $event->update(5);

控制器的实际位置是

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

输出如下:

  1. update:5

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