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"

能在命令行下运行能看到同样的结果

例中的执行顺序:

  1. 取得 $_GET['c'] (控制器=user) 和 $_GET['a'] (动作=index)
  2. 创建实例 user_control
  3. 调用 base_control 的析构方法:__construct($conf);
  4. 调用 user_control 的析构方法:__construct($conf);
  5. 调用 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)

什么时候需要用到分离业务代码?

  1. 同一个 control 中需要写很多的不同的业务处理方法,维护成本太高
  2. 同一个 control 有些业务逻辑使用频率少,但是占用篇幅过大
  3. 一个 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');
    }
}

results matching ""

    No results matching ""