PHP深入解读MVC框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP深入解读MVC框架相关的知识,希望对你有一定的参考价值。

MVC的开发模式在这里就不在赘述

成熟的MVC框架有很多,本文的目的是在帮助初学者了解MVC的工作原理

直入主题

技术分享图片

其中Application目录下:包括配置文件,控制器目录,模型,视图

技术分享图片

Myphp框架目录下:有核心文件,数据库操作类,帮助类,第三方类等

技术分享图片

core目录下:控制器基类,框架核心类,模型基类

技术分享图片

 

创建完这些基本的目录后,在项目的根目录下创建index.php目录,这是所有请求的入口

<?php
    // 引入框架核心类
    include "MyPHP/core/Framework.class.php";
    // 调用初始化方法
    Framework::run();

在Framework.class.php中对请求地址进行解析,实例化对应控制器,执行相应方法

<?php 
    class Framework{
        public static function run(){
            //这里执行的顺序不能错
            self::init();
            self::auto_load();
            self::route();
        }
        //定义控制器、视图、配置文件路径,获得当前请求控制器和方法名
        public static function init(){
            define("DS", DIRECTORY_SEPARATOR);
            define("ROOT", getcwd().DS);
            define("APP_PATH", ROOT."Application".DS);
            define("FRAMEWORK_PATH", ROOT . "MyPHP" .DS);
            define("PUBLIC_PATH", ROOT . "Public" . DS);
            define("MODEL_PATH", APP_PATH . "Model" . DS);
            define("VIEW_PATH", APP_PATH . "View" . DS);
            define("CONTROLLER_PATH", APP_PATH . "Controller" .DS);
            define("CONFIG_PATH", APP_PATH . "Config" .DS);
            define("CORE_PATH", FRAMEWORK_PATH . "core" .DS);
            define("DB_PATH", FRAMEWORK_PATH . "database" . DS);
            define("HELPER_PATH", FRAMEWORK_PATH . "helpers" . DS);
            define("LIB_PATH", FRAMEWORK_PATH . "libraries" .DS);
            //从用户请求中 获得 当前平台 控制器 方法
            define("PLATFORM", isset($_REQUEST[‘p‘])?$_REQUEST[‘p‘]:"Home");
            define("CONTROLLER", isset($_REQUEST[‘c‘])?$_REQUEST[‘c‘]:"Index");
            define("ACTION", isset($_REQUEST[‘a‘])?$_REQUEST[‘a‘]:"index");
            //获得当前请求控制器 和视图的路径
            define("CUR_CONTROLLER_PATH", CONTROLLER_PATH.PLATFORM.DS);
            define("CUR_VIEW_PATH", VIEW_PATH.PLATFORM.DS);
            //获得文件上传路径
            define("UPLOAD_PATH", PUBLIC_PATH."upload".DS);
            //手动载入核心类
            require CORE_PATH."Controller.class.php";
            require CORE_PATH."Model.class.php";
            require DB_PATH."mysql.class.php";
            //载入配置文件
            $GLOBALS[‘config‘] = include CONFIG_PATH."config.php";
            //通常放在公共文件头部,这样各页面调用的时候就不会冲突了, 设置时区,编码,开启ob等操作一般都放
            //方法头部的好处是可以在程序被调用时就自动执行,且不重复执行
            session_start();
        }
        //路由方法
        public static function route(){
            //确定类名和方法名
            $controller_name = CONTROLLER."Controller";
            $action_name = ACTION."Action";
            //实例化控制器类
            $controller = new $controller_name;
            //实行方法
            $controller->$action_name();
        }
        //注册自动加载
        //当new 一个不存在的类时会自动调用spl_autoload_register中注册的方法,并将类名作为参数传入
        public static function auto_load(){
            spl_autoload_register(array(__CLASS__,"load"));
        }
        //加载方法
        public static function load($className){
            //控制器类和模型类,如GoodsController,AdminModel
            if (substr($className, -10) == ‘Controller‘){
                require CUR_CONTROLLER_PATH . "{$className}.class.php";
            } elseif (substr($className, -5) == "Model"){
                require MODEL_PATH . "{$className}.class.php";
            } else {
                //其它情况,暂无
            }
        }
    }

测试:在地址栏中输入 http://localhost/Shop/index.php?p=Admin&c=Index&a=index

会自用调用IndexController控制器下的indexAction方法

<?php
    class IndexController{
        public function indexAction(){
            echo "这是Controller控制器下的index方法";
        }
    }

技术分享图片

以上是关于PHP深入解读MVC框架的主要内容,如果未能解决你的问题,请参考以下文章

深入了解php框架mvc设计模式的原理

编写PHP框架,深入了解MVC运行流程

手把手编写PHP框架 深入了解MVC运行流程

PHP开发一个属于自己MVC框架

php mvc框架的理解

php的tp框架和mvc有什么区别?