zoukankan      html  css  js  c++  java
  • 怎样封装一个自己的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("coremymvc::autoload");

    //启动框架
    coremymvc::run();

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

    <?php 
    namespace corelib;

    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 corelib oute();

            //加载控制器方法
            $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.通过以上操作就可以简单的完成一个控制器方法的访问

  • 相关阅读:
    16. 3Sum Closest
    17. Letter Combinations of a Phone Number
    20. Valid Parentheses
    77. Combinations
    80. Remove Duplicates from Sorted Array II
    82. Remove Duplicates from Sorted List II
    88. Merge Sorted Array
    257. Binary Tree Paths
    225. Implement Stack using Queues
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/quanzhiguo/p/7363342.html
Copyright © 2011-2022 走看看