### 场景分析
* 正常情况下,使用上一节中的配置文件来绑定模板,已经可以满足大部分场景需求了;
- 而且在模板里面,也可直接使用标签,方便的调用数据;
- 所以,这也是系统默认的 路由绑定模板,输出视图的买方式;
* 但也有一些特殊场景,这样配置不能满足需求;
- 一些人习惯了任何页面都用:`控制器-方法` 来获取数据,输出视图;
- 一些场合,如不同类别(或会员级别),使用不同模板,输出不同视图;
- 特别是一些专题;每个(类)专题需要设置不同模板
- …
- 这时候,经典的:`控制器-方法` 模式登场了!
### 控制器规范
* 控制器规范
- 控制器文件放在每一组模板目录下的:`/_ctrls/下`;
如:`/views/comm/_ctrls/`, `/views/adm/_ctrls/`;
- 每一个模型,用一个控制器文件,如:`infoCtrl.php`, `newsCtrl.php`;
- 方法名类似:`mapAct`, `dutyAct` ... 对应 `info-map`, `info-duty` 路由;
- 命名空间:在 imcat 的基础上,按模板目录增加一层,如:`namespace imcat\comm;`, `namespace imcat\adm;`
* 代码示例
文件:`{views}/demo/_ctrls/modcCtrl.php`
[查看代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/_ctrls/modcCtrl.php)
* 返回数据
- [返回数据给模板]({=PATH_PROJ}/demo.php?modc-hello), 一般情况下,模板数据可不用方法返回,这是只是示范;模板里可直接使用标签调用数据,将在后续章节介绍;
- [返回jsonp数据]({=PATH_PROJ}/demo.php?modc-jsonp&callback=mycb), callback 参数省略则为 `callback=callback`;
- [返回json数据]({=PATH_PROJ}/demo.php?modc-json);
- [返回xml数据]({=PATH_PROJ}/demo.php?modc-xml);
* 模板控制
- 更改模板:[路由`modc-m2kid1`]({=PATH_PROJ}/demo.php?modc-m2kid1),方法`m2kid1Act`,设置`newtpl = 'mod2/kid1';` : 更改模板为`{views}/demo/mod2/kid1.htm`;
- 更改模板:[路由`modc-hi`]({=PATH_PROJ}/demo.php?modc-hi),方法`hiAct`,设置`newtpl = 'modc/hello';` : 更改模板为`{views}/demo/modc/hello.htm`;
- 原始包含-不解析判断:[路由`modc-tplorg`]({=PATH_PROJ}/demo.php?modc-tplorg),方法`tplorgAct`,设置`tplorg = 'modc/tplorg';` : 更改模板为`{views}/demo/modc/tplorg.htm`,切模板为纯htm或php代码,标签不会解析;
- 不需要模板-方法里处理就结束了:[路由`modc-notpl`]({=PATH_PROJ}/demo.php?modc-notpl),方法`notplAct`,设置`tplnull = 1;` : 设置不需要模板;当然,也可直接在方法里面`die()`;
* 其它DIY
- 多语言跳转:使用控制器-方法;另一个用途是自定义跳转:比如企业站有五个语言展示版本,那可根据ip地址,或客户的设置,跳转到相应的语言;
- 多城市分站跳转:如果全国有200个地区级分站,那可先根据ip得到城市名称,然后跳转到响应分站;
- [跳转示例]({=PATH_PROJ}/demo.php?modc-jump),根据这些代码提示,自己组装url跳转...
- 其它玩法,看你的想象了 !!!
### 默认方法
* 思想来源
- 这个思想,来源于ThinkPHP的`空操作/_empty()`;系统在找不到路由对应的操作方法时,会定位到默认方法(\_defAct)(如果有)来执行。
* 场景示例
- 上述控制器 `modcCtrl` 定义了一些方法;那么除上述之外,我任意输入其他类似`modc-xxx`的路由,想让它们统一通过一个方法执行;
- 此时,我们可以定义`\_defAct`方法;
* 默认方法测试
- [modc-xxxx]({=PATH_PROJ}/demo.php?modc-xxx)
- [modc-peace]({=PATH_PROJ}/demo.php?modc-peace)
- [modc-imcat]({=PATH_PROJ}/demo.php?modc-imcat)
- [modc-test]({=PATH_PROJ}/demo.php?modc-test)
### 默认控制器
* 思想来源
- 这个思想,来源于ThinkPHP的`空控制器/EmptyController`;当系统找不到请求的控制器名称的时候,系统会尝试定位默认控制器(\_defCtrl)。
* 配置(后台为例)
- 配置文件:/veiws/adm/\_config/va_home.php;
- 配置值:'c.\_defCtrl' => '_defCtrl';
- 控制器文件:/veiws/adm/\_ctrls/\_defCtrl.php;
- [查看源码]({=PATH_PROJ}/demo.php?home-code&fp=adm/_ctrls/_defCtrl.php);
* 说明/应用
- a. 典型的应用,就是后台管理;[查看代码]({=PATH_PROJ}/demo.php?home-code&fp=adm/_ctrls/_defCtrl.php)
- b. /book.php 入口下,默认文档页面,都用同样的方法来处理;[查看代码]({=PATH_PROJ}/demo.php?home-code&fp=book/_ctrls/_defCtrl.php)
- c. /demo.php 入口下,未配置默认控制器;
一旦配置:核心基础 - 绑定模板 - 默认模板 中 测试路由 等 url,都会定位到 默认控制器;导致一些问题无法说明;
-End-