• 技术文章 >php教程 >php手册

    php中mvc框架总结1(7)

    2016-06-06 19:44:44原创534

    1 .代码结构的划分: 目前的目录结构: / 站点根目录 /application/ 应用程序目录 Model / 模型目录 View / 视图目录 Back / 后台 front / test / 测试平台 Controller / 控制器目录 Back / 后台 front / 前台 test / 测试平台 /framework/ 框架 目录 MySQL

    1.代码结构的划分:

    目前的目录结构:
    /站点根目录
    /application/应用程序目录
        Model/模型目录
        View/视图目录
            Back/后台
            front/
            test/测试平台
        Controller/控制器目录
            Back/后台
            front/前台
            test/测试平台
    /framework/框架目录
        MySQLDB.class.php 数据库操作类DAO
        Model.class.php 基础模型类
    /index.php入口文件

    2.请求首页

    2.1请求首页参数实例(请求localhost/index.php?p=front&c=shop&a=index)

     P=front  //后台还是前台 参数有back和front
     C=index   //控制器,此处请求首页控制器
     A=shop   //动作,此处为首页shop动作

    2.2 首页统一请求代码

    php
    //首先载入框架
    require './framework/Framework.class.php';
    //运行项目
    Framework::run();

    2.3框架类代码

    /**
     * 框架类 初始化基础功能
     */
    class Framework {
        /**
         * 项目框架类的运行入口
         */
        public static function run() {
            self::_initPathConst();//初始化路径常量
            self::_initConfig();//加载配置
            self::_initDispatchParam();//初始化分发参数
            self::_initPlatformPathConst();//初始化平台相关的路径常量
            self::_initAutoload();//注册自动加载方法
            self::_dispatch();//请求分发
        }
    }

    2.3.1初始化路径常量

    /**
         * 初始化路径常量
         */
        private static function _initPathConst() {
            //确定项目中使用的路径常量
            define('ROOT_PATH', getCWD() . '/');//项目的根目录
            
            define('APP_PATH', ROOT_PATH . 'application/');//应用程序目录
            define('CON_PATH', APP_PATH . 'controller/');//控制器目录
            define('MOD_PATH', APP_PATH . 'model/');//模型目录
            define('VIE_PATH', APP_PATH . 'view/');//视图层目录
            define('CFG_PATH', APP_PATH . 'config/');//配置文件目录
    
            define('FRW_PATH', ROOT_PATH . 'framework/');//框架目录
            define('TOL_PATH', FRW_PATH . 'tool/');//工具目录
    
            define('PUB_PATH', ROOT_PATH . 'public/');//公共资源目录
            define('UPD_PATH', PUB_PATH . 'upload_image/');//上传图片目录
        }

    2.3.2加载配置文件

    private static function _initConfig() {
            //载入加载配置文件,并将配置项的值保存与 $config,全局变量中。
            $GLOBALS['config'] = require CFG_PATH . 'application.config.php';
        }

    2.3.3初始化分发参数

    /**
         * 确定p,c,a参数,分发参数,(路由参数)
         */
        private static function _initDispatchParam() {
            //获得平台参数
            $GLOBALS['p'] = $p = isset($_GET['p']) ? $_GET['p'] : $GLOBALS['config']['app']['default_platform'];//p,platform
            //获得控制器类参数
            $GLOBALS['c'] = isset($_GET['c']) ? $_GET['c'] : $GLOBALS['config'][$p]['default_controller'];//c,controller
            //获得动作参数
            $GLOBALS['a'] = isset($_GET['a']) ? $_GET['a'] : $GLOBALS['config'][$p]['default_action'];//a,action
        }

    以上代码中用到了初始加载配置文件,初始化默认请求,当你直接请求:localhost/index.php,没有参数的时候,加载系统默认参数

    2.3.4初始化平台相关的路径常量

    /**
         * 初始化当前平台相关的路径常量
         * 这个是用来判断P的,找到究竟是哪个控制下
         */
        private static function _initPlatformPathConst() {
            //与当前平台相关的路径常量
            define('CUR_CON_PATH', CON_PATH . $GLOBALS['p'] . '/');//当前平台的控制器目录
            define('CUR_VIE_PATH', VIE_PATH . $GLOBALS['p'] . '/');//当前平台的视图层目录
        }

    2.3.4注册自动加载方法

    private static function _initAutoload() {
            //注册自动加载
            spl_autoload_register(array(__CLASS__, 'selfAutoload'));
        }
    'selfAutoload'方法如下
    public static function selfAutoload($class_name) {
            //先判断是否为框架核心类,框架中可以被确定的类
            $class_file = array(
                'Model' => FRW_PATH . 'Model.class.php',
                'MySQLDB' => FRW_PATH . 'MySQLDB.class.php',
                'Controller' => FRW_PATH . 'Controller.class.php',
                'SessionDB' => TOL_PATH . 'SessionDB.class.php',
                'Captcha' => TOL_PATH . 'Captcha.class.php',
                'Upload' => TOL_PATH . 'Upload.class.php',
                'Image' => TOL_PATH . 'Image.class.php',
                'Page' => TOL_PATH . 'Page.class.php',
            );
            if (isset($class_file[$class_name])) {
                //是核心类
                require $class_file[$class_name];
            }    
            //是否为模型类
            elseif (substr($class_name, -5) == 'Model') {
                //模型类
                require MOD_PATH . $class_name . '.class.php';
            }
            //是否为控制器类
            elseif (substr($class_name, -10) == 'Controller') {
                //控制器类
                require CUR_CON_PATH . $class_name . '.class.php';
            }
        }

    2.3.4 请求分发

    /**
         * 请求分发
         * 将请求交由 某个控制器的某个动作完成
         */
        private static function _dispatch() {
            //实例化控制器类,与 调用相应的动作方法
            //ucfirst() 函数把字符串中的首字符转换为大写。
            $controller_name = ucfirst($GLOBALS['c']) . 'Controller';//match Match . Controller
            //载入控制器类
            $controller = new $controller_name;//可变类名
    
            //调用动作方法
            $action_name = $GLOBALS['a'] . 'Action';
            $controller->$action_name();//可变方法
        }

    2.3.5当我们请求localhost/index.php的时候,相当于请求localhost/index.php?p=front&c=shop&a=index于是将初始化

    application\controller\front下的ShopController控制器,请求动作为indexAction

    indexAction代码如下:

    public function indexAction() {
            //得到分类数据
            $model_cat = new CatModel;
            $cat_list = $model_cat->getNestedList();
            //载入前台首页模板
            require CUR_VIE_PATH . 'index.html';
        }

    需要说明的是:

    1、ShopController继承与平台控制器PlatformController,平台控制器继承于基础控制器类:controller

    关系如下:

    2、在确定好MVC中的,Control动作后,接下来就是实现Model

       $model_cat = new CatModel;   ——》 便是实例化catModel类
        $cat_list = $model_cat->getNestedList();  ——》取得所有前台分类

    3、在基础模型中,封装好所有基础操作数据库方法,其中getNestedLIst方法如下

    /**
         * 得到嵌套的分类列表数据
         */
        public function getNestedList($p_id=0) {
            //获得所有分类
            $list = $this->getList();
            //制作嵌套的数据,递归查找
            return $this->getNested($list, $p_id);
        }

    4、getList方法如下

     /**
         * 获得列表数据
         */
        public function getList() {
            $sql = "select * from `php_category`";
            return $this->_db->fetchAll($sql);
        }

    5、Model实现好之后,就是载入View

        //载入前台首页模板
        require CUR_VIE_PATH . 'index.html';

    2.3.6 总结:实现一个功能,首先确定Control,然后实现Model,最后载入View

    2.3.7效果图 前台页面不加以阐述

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:关于腾讯ip接口一个流传很广的错误用法 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • PHP实现采集程序原理和简单示例代码• 我自己借用精华区里的MIME类写了一个基本的发信小东东(2)• php学习笔记之cookie/session• php将csv文件导入到mysql数据库的方法,• 无法载入 mysql 扩展,请检查 PHP 配置
    1/1

    PHP中文网