·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> php中mvc框架总结1(7)

php中mvc框架总结1(7)

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
php中mvc框架总结1(7)

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效果图 前台页面不加以阐述