怎样封装一个自己的MVC框架(二)

 

1.首先需要写一个开口文件

主要包括以下几点

 1.定义常量(路由)
 2.加载类库

 3.启动框架

 

<?PHP 
/**
 * 1.入口文件
 * 2.定义常量(路由)
 * 3.加载类库
 * 4.启动框架
 */

//定义根目录
define("ROOT",dirname(__FILE__));

//定义核心文件目录
define('CORE', ROOT."/core");

//项目目录
define('APP', ROOT."/app");

//项目目录相对路径
define('MODULE', "app");

//是否开启调试模式
define('DEBUG',true);

if (DEBUG) {
    ini_set('display_error', 'On');
}else{
    ini_set('display_error', 'Off');
}

//引入公共文件
include CORE."/common/function.php";

//p(ROOT);

//引入核心类库
include CORE."/mymvc.php";

//自动加载
spl_autoload_register("\core\mymvc::autoload");

//启动框架
\core\mymvc::run();

 

 

2.定义路由,写一个路由类,通过构造函数解析路由信获取控制器方法,及get传值

<?php 
namespace core\lib;

class route
{
    //定义控制器
    public $control;

    //定义方法
    public $action;

    //定义构造函数解析路由
    public function __construct()
    {
        //获取url参数,获取控制器、方法
        if (isset($_SERVER['PATH_INFO'])&&$_SERVER['PATH_INFO']!="/") {
            //获取url控制器、方法
            $path=$_SERVER['PATH_INFO'];
            $patharr=explode("/",trim($path,"/"));
            //p($patharr);

            //定义控制器、方法名
            if (isset($patharr[0])) {
                $this->control=$patharr[0];
            }

            if (isset($patharr[1])) {
                $this->action=$patharr[1];
            }else{
                $this->action="index";
            }

            //获取参数的值
            $count=count($patharr)+2;
            $i=2;
            while ($i < $count) {
                if (isset($patharr[$i+1])) {
                    $_GET[$patharr[$i]]=$patharr[$i+1];
                }
                
                $i+=2;
            }
            //p($_GET);

        }else{
            $this->control="index";
            $this->action="index";
        }
    }
}

 

3.写一个核心文件来加载类文件;自动加载类文件,然后加载路由类文件,解析路由获取控制器、方法,

通过开口文件的自动加载类,根据获取的控制器方法,加载控制器获取结果

 

<?php 
namespace core;

class mymvc
{
    //定义加载类地图
    public static $classMap=array();

    //开启框架
    static function run()
    {
        //p('OK');
        $route=new \core\lib\route();

        //加载控制器方法
        $control=$route->control;
        $action=$route->action;
        //拼接控制器文件目录
        $controlfile=APP."/controllers/".$control."Controller.php";

        //拼接控制器路径
        $controlpath="\\".MODULE."\controllers\\".$control."Controller";
        if (is_file($controlfile)) {
            include $controlfile;
            $con=new $controlpath();
            $con->$action();
        }else{
            throw new \Exception('找不到控制器'.$control);
        }


    }

    //加载类文件
    static function autoload($class)
    {
        //首先判断该类是否已经调用
        if (isset($classMap[$class])) {
            return true;
        }else{
            //拼接类文件路径
            $class=str_replace("\\", "/", $class);
            $file=ROOT."/".$class.".php";
            if (is_file($file)) {
                include $file;
                self::$classMap[$class]=$class;
            }else{
                return false;
            }
        }

    }
}

 

4.通过以上操作就可以简单的完成一个控制器方法的访问

 

posted @ 2017-08-15 09:23  QuanZhiGuo的博客  阅读(363)  评论(0编辑  收藏  举报