mzphp 控制器
在项目 control 目录中建立一个 user_control.class.php
同时,在该文件中定义一个 user_control 继承 base_control
<?php
!defined('FRAMEWORK_PATH') && exit('Accesss Deined');
class user_control extends base_control {
// 重载析构
public function __construct(&$conf) {
// 设置当 on_{action} 方法找不到时,拼接 ROOT_PATH.'control/user/{action}.php' 文件路径进行执行
// 可用于分离 control 的业务逻辑(在下章「分离业务代码」中会讲到)
$this->run_path = ROOT_PATH.'control/user/';
parent::__construct($conf);
}
public function on_index(){
// define user
$user = 'djunny';
// assign variables
VI::assign('user', $user);
// batch assign
VI::bind([
'user' => $user,
'count' => 1,
]);
// default template path is view/user_index.htm
$this->show();
}
}
$this->show 调用显示模板
可以自动识别为 view/user_index.htm,
即 {$control}_{$action}.htm
假如,view/user_index.htm 如下:
hello {$user}
使用 index.php?c=user-index 可访问到 user_control 的 on_index 方法,显示结果:
hello djunny
同时,使用命令行下:
php index.php user index
或者以下方式:
php index.php "c=user-index&id=1"
能在命令行下运行能看到同样的结果
例中的执行顺序:
- 取得 $_GET['c'] (控制器=user) 和 $_GET['a'] (动作=index)
- 创建实例 user_control
- 调用 base_control 的析构方法:__construct($conf);
- 调用 user_control 的析构方法:__construct($conf);
- 调用 user_control 的 public 方法 on_index
小提示:
base_control 类已经在启动的时候加入到 runtime.php 了,所以不用担心他没有被加载。
在命令行下,你可以 core 中建立一个 cmd_control,在析构方法中做一些限制,例如判断是否 cmd 下运行(可以用 core::is_cmd() 方法), user_control 继承 cmd_control,能有效的防止 control 被 http 请求到。(已实现,可以直接 extends cli_control )core 目录中的创建 runtime 顺序是先加载 base_*.class.php 基类,再加载 *.class.php,所以,在确保性能的情况下缓存代码到一个文件,所有的 control 都可以四层继承:base_control.class.php -> core/base_*.class.php -> core/*.class.php -> control/*_control.class.php 基本满足一个稍复杂的系统所有继承需求了。
在命令行下,不建议使用 echo 来输出 log,可以使用帮助类 log::info($output) 来输入出 log。$output 可以为字符串、数字、数组、MAP。
VI::assign 是传引用绑定变量、VI::assign_value 是传值绑定变量、VI::bind 是传值绑定变量
如果调用 $this->show('user/index'),代表渲染 view/user/index.htm 模板文件。
大型项目中,如何分离业务代码 (使用 run_path)
什么时候需要用到分离业务代码?
- 同一个 control 中需要写很多的不同的业务处理方法,维护成本太高
- 同一个 control 有些业务逻辑使用频率少,但是占用篇幅过大
- 一个 control 文件太大,需要优化 I/O 和编译执行速度
继续以上的例子,我们将 user_control 的 run_path 指向了 ROOT_PATH 下的 control/user 目录,
此时,我们在 control/user 目录下建立一个文件,如:credit_info.php,内容如下:
<?php
!defined('FRAMEWORK_PATH') && exit('Accesss Deined');
$uid = core::R('uid:int');
echo $uid;
访问:
index.php?c=user-credit_info
即可控制 control 执行 credit_info.php 文件。
分离业务文件名,应遵循命名规范:
control目录/[control]/[submodule]_[action].php
缓存方法
最新版本中,控制器支持缓存页面:
<?php
!defined('FRAMEWORK_PATH') && exit('Accesss Deined');
class user_control extends base_control {
public function on_cache(){
// 取得用户 uid
$uid = core::R('uid:int');
// 第 1次访问:在缓存中,缓存当前页面为 user_uid,缓存 1个小时
// 第 2-n 次访问:读取 user_uid 的页面,直接返回给浏览器,不再执行该句代码后方的逻辑。
$this->cache_page('user_'.$uid, 3600);
// define user
$user = 'djunny';
// assign variables
VI::assign('user', $user);
// default template path is view/user_cache.htm
$this->show('user/cache');
}
}