β

从零构建PHP商用MVC框架(6.2模板引擎-脚本运行类库)

互联网技术实践 161 阅读

上节我们讲了如何在 mvc中引入smarty模板引擎 ,本节我们讲改进mvc框架支持脚本运行类库,这个在某些项目中用途很大,比如后台任务等等!

首先我们需要改进myf.php类库把它拆分成一个基础类库和入口类库,如下:

core.php代码:


<?php
/**
 * myfmvc核心入口类库
 * User: minyifei.cn
 * Date: 15/6/18
 */

//设置时区
date_default_timezone_set('PRC');
header("Content-Type:text/html; charset=utf-8");
//开启session
session_start();
//项目跟路径
define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']));
//项目相对目录
define("SITE_PATH", dirname($_SERVER['SCRIPT_NAME']));
//系统配置路径
define('APP_SYS_PATH', dirname(__FILE__));
define('APP_SITE_PATH', dirname(dirname(__FILE__)));
//引用全局函数
require_once(APP_SYS_PATH."/functions.php");
//加载数据库操作文件
require_once(APP_SYS_PATH."/db.php");
//加载smarty模板引擎
require_once(APP_SYS_PATH."/smt/Smarty.class.php");
//定义配置文件
$_config = array();
$configFile = dirname(APP_SYS_PATH)."/config.php";
if(file_exists($configFile)){
    $_config = require_once ($configFile);
}
//临时文件目录
$tempPath = C("temp_path");
if(!isset($tempPath)){
    //如果没有配置缓存目录,默认是根目录下的runtime文件夹
    $tempPath = dirname(APP_SYS_PATH)."/runtime/";
}
define("TEMP_PATH",$tempPath);
//定义缓存目录
define('CACHE_PATH',TEMP_PATH."cache/");
//定义日志存放目录
define('LOG_PATH',TEMP_PATH."log/");
//加载命名空间文件
$namespaces = C("namespaces");
spl_autoload_register("loader");

myf.php代码如下:


<?php
/**
 * mvc核心类库 myf.php
 * User: www.minyifei.cn
 * Date: 15/4/23
 */

require_once("core.php");

//获取路由解析器
$route = getMvcRoute();
//控制器
$mvcController = $route["c"];
//执行方法
$mvcAction = $route["a"];
//控制器的命名规则为:XxxController
$mvcControllerName = $mvcController."Controller";
//加载控制器文件
$mvcControllerFile = sprintf("%s/app/controller/%s.php",APP_PATH,$mvcControllerName);
if(file_exists($mvcControllerFile)){
    //加载基类controller
    require_once APP_SYS_PATH."/controller.php";
    require_once $mvcControllerFile;
    $myfC = new $mvcControllerName();
    //初始化系统方法
    $myfC->_sys_init_action($mvcController);
    //执行前置方法
    $myfC->_before_action();
    //执行用户方法
    $myfC->{$mvcAction}();
    //执行后置方法
    $myfC->_after_action();
}else{
    echo "404 page not found";
}

然后再增加个cli.php,代码如下:


<?php
/**
 * php代码执行入口函数
 * 用法: php cli.php test main
 * User: minyifei.cn
 * Date: 15/6/18
 */

require_once("core.php");

$count = count($argv);
if($count>=2){
    $controllerName = $argv[1];
    $actionName = "main";
    if(isset($argv[2])){
        $actionName = $argv[2];
    }
    $className = mb_ucfirst($controllerName)."Task";
    $fileName = APP_SITE_PATH."/app/task/".$controllerName."Task.php";
    if(file_exists($fileName)){
        include($fileName);
        $task = new $className();
        $task->_before_action();
        $task->$actionName();
        $task->_after_action();
    }
}

再增加个基础task类库,代码如下:


<?php
/**
 * 任务基类
 * User: minyifei.cn
 * Date: 15/6/18
 */

namespace Myf\Mvc;

class Task {

    //前置函数
    public function _before_action(){

    }

    //后置函数
    public function _after_action(){

    }

    public function main(){
        echo "hello myfmvc task !";
    }

}

写个demo大家看看,需要在app\task\DataTask.php类库,代码如下:


<?php
/**
 * 任务测试类
 * User: minyifei.cn
 * Date: 15/6/18
 */

use Minyifei\Model\User;

class DataTask extends \Myf\Mvc\Task {

    public function _before_action(){
        echo "==before action\n";
    }

    public function _after_action(){
        echo "==after action\n";
    }

    public function main(){
        $m = new User();
        $datas = $m->limit(0,10)->find();
        foreach($datas as $d){
            echo $d["id"].",".$d["mobile"].",".$d["created"]."\n";
        }
    }

}

进入myf目录执行php cli.php data main运行结果如下图:
myfmvc task

上次本节的tag供大家下载: https://git.oschina.net/myfcms/mvc/tree/v6.2

作者:互联网技术实践
闵益飞博客

发表评论