控制器概况

ginkgo 的控制器定义比较灵活,无需继承任何基础类,也可以继承框架预先封装的 ginkgo\Ctrl 类或者其他的控制器类。


控制器定义

一个典型的控制器类定义如下:

  1. namespace app\ctrl\index;
  2. class Index {
  3. public function index() {
  4. return 'index';
  5. }
  6. }

控制器的实际位置是

app/ctrl/index/index.ctrl.php

控制器类可以无需继承任何类,命名空间默认以 app 为根命名空间。

如果要在控制器里面渲染模板,可以使用:

  1. namespace app\ctrl\index;
  2. use ginkgo\View;
  3. class Index {
  4. public function index() {
  5. $view = View::instance();
  6. return $view->fetch('index');
  7. }
  8. }

如果继承了 ginkgo\Ctrl 类,可以直接调用如下类的实例:

  1. class Ctrl {
  2. // ginkgo\Request 的实例
  3. protected $obj_request;
  4. // ginkgo\View 的实例
  5. protected $obj_view;
  6. // ginkgo\Lang 的实例
  7. protected $obj_lang;
  8. }

例如:

  1. namespace app\ctrl\index;
  2. use ginkgo\Ctrl;
  3. class Index extends Ctrl {
  4. public function index() {
  5. // 获取包含域名的完整 URL 地址
  6. $this->assign('domain', $this->obj_request->root(true));
  7. return $this->fetch('index');
  8. }
  9. }

渲染输出

默认情况下,控制器的输出全部采用 return 的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出。下面都是有效的输出方式:

  1. namespace app\ctrl\index;
  2. class Index {
  3. public function hello() {
  4. return 'hello, world!';
  5. }
  6. public function json() {
  7. return json_encode($data);
  8. }
  9. public function read() {
  10. $view = View::instance();
  11. return $view->fetch('index');
  12. }
  13. }

控制器一般不需要任何输出,直接 return 即可。


特别注意

根据 概况 -> 开发规范 的要求,因此 ginkgo 采用了如下两种自动转换的策略:

  • 文件夹和文件的命名使用使用小写和下划线,当路由中的模块与控制器为小写字母和横杠时,系统会将横杠 - 转换为下划线 _

  • 方法的命名使用驼峰法(首字母小写),但是路由都使用小写,当路由中的动作命名为小写字母和下划线或横杠时,系统会将动作自动转换为驼峰法(首字母小写)。

如果当前访问的地址是

http://server/index.php/mod-index/ctrl-index/hello-world 0.1.1 新增

http://server/index.php/mod_index/ctrl_index/hello_world

控制器的实际位置是

app/ctrl/mod_index/ctrl_index.ctrl.php

控制器类定义如下:

  1. namespace app\ctrl\mod_index;
  2. class Ctrl_Index {
  3. public function helloWorld() {
  4. return 'hello_world';
  5. }
  6. }