home-code

示例❤源码



### 场景分析

* 正常情况下,使用上一节中的配置文件来绑定模板,已经可以满足大部分场景需求了;
  - 而且在模板里面,也可直接使用标签,方便的调用数据;
  - 所以,这也是系统默认的 路由绑定模板,输出视图的买方式;

* 但也有一些特殊场景,这样配置不能满足需求;
  - 一些人习惯了任何页面都用:`控制器-方法` 来获取数据,输出视图;
  - 一些场合,如不同类别(或会员级别),使用不同模板,输出不同视图;
  - 特别是一些专题;每个(类)专题需要设置不同模板
  - …
  - 这时候,经典的:`控制器-方法` 模式登场了!


### 控制器规范

* 控制器规范
  - 控制器文件放在每一组模板目录下的:`/_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-