Maison  >  Article  >  php教程  >  php中mvc框架总结1(7)

php中mvc框架总结1(7)

WBOY
WBOYoriginal
2016-06-06 19:44:44917parcourir

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

1.代码结构的划分:

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

php中mvc框架总结1(7)

2.请求首页

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

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

2.2 首页统一请求代码

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

 2.3框架类代码

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

2.3.1初始化路径常量

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

 2.3.2加载配置文件

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

 2.3.3初始化分发参数

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

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

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

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

2.3.4注册自动加载方法

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

2.3.4 请求分发

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

        </span><span>//</span><span>调用动作方法</span>
        $action_name = $GLOBALS[<span>'</span><span>a</span><span>'</span>] . <span>'</span><span>Action</span><span>'</span><span>;
        $controller</span>->$action_name();<span>//</span><span>可变方法</span>
    }

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

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

     indexAction代码如下:

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

需要说明的是:

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

关系如下:php中mvc框架总结1(7)

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

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

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

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

4、getList方法如下

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

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

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

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

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

php中mvc框架总结1(7)

 

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn