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, -) == 'Model') {
//模型类
require MOD_PATH . $class_name . '.class.php';
}
//是否为控制器类
elseif (substr($class_name, -) == '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=) {
//获得所有分类
$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效果图  前台页面不加以阐述

php中mvc框架总结1(7)的更多相关文章

  1. cocos2dx之lua项目开发中MVC框架的简单应用

    **************************************************************************** 时间:2015-03-31 作者:Sharin ...

  2. 谈谈service层在mvc框架中的意义和职责

    mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层设计, ...

  3. 简述MVC框架模式以及在你(Android)项目中的应用

    标题是阿里电话面试的问题,一直以为自己很清楚MVC模式,结果被问到时,居然没法将MVC和Android中各个组件对应起来,所以,面试肯定挂了,不过面试也是学习的一种方式,可以知道大公司看中什么,以及自 ...

  4. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...

  5. 找到MVC框架中前端URL与后端同步的解决方案

    基本思路: 先用URL标签生成完整的URL字符,前端动态参数的部分以适配符先填充,最后动态参数利用正则匹配进行替换. 这种方式,可以在各种MVC框架中适用,妙. 不废话,上码. var url = & ...

  6. 2014-07-30 MVC框架中对SQL Server数据库的访问

    今天是在吾索实习的第16天.我自己主要学习了基于MVC框架的系统的开发时,对SQL Server数据库的相关访问.其步骤如下: 第一步,在Models文件夹中创建一个类,并命名为Movies.cs,如 ...

  7. [原]命令模式在MVC框架中的应用

    其实在项目开发中,我们使用了大量的设计模式,只是这些设计模式都封装在框架中了,如果你想要不仅仅局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之一就是命令模式,先来看看模式是如何 ...

  8. 命令模式在MVC框架中的应用

    事实上在项目开发中,我们使用了大量的设计模式,不过这些设计模式都封装在框架中了,假设你想要不只局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之中的一个就是命令模式,先来看看模式 ...

  9. 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署

    用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...

随机推荐

  1. 迷你MVVM框架 avalonjs 1.3.4发布

    发现一个以前从来没发现的大BUG,紧急发布此版本. fix getEachProxy BUG,此BUG会导致监控数组在删除某元素然后再添加元素时出现问题. avalon ms-on-*绑定添加一个钩子 ...

  2. onItemLongClick+onCreateContextMenu实现长按ListItem弹出不同菜单

    个ListActivity,长按不同的item弹出的菜单不一样 参照

  3. push和pop指令的使用

  4. 15.3Sum (Two-Pointers)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. Emacs中编辑保存makefile文件时会错误地将TAB转成空格的解决方法

    问题描述 我的Emacs使用了Purcell的配置,在其配置中使用了whitespace-cleanup,且通过在.emacs.d/lisp/init-edit-utils.el中设定: (requi ...

  6. Windows pip安装失败:no module named pkg_resources

    通常是Setuptools安装出错,下载以下ez_setup.py文件后,先执行:ez_setup.py -U setuptools 重新安装setuptools 通过此ez_setup.py pip ...

  7. Golang之方法(自定义类型,struct)

    方法的使用,请看本天师的代码 //Golang的方法定义 //Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,不仅仅是struct //定义:func (recevier ...

  8. js中 new Date()使用说明

    var myDate = new Date(); // myDate.getYear(); //获取当前年份(2位)(该方法获取年份,涉及到浏览器兼容问题,所以不推荐使用!) // myDate.ge ...

  9. docker 关于volumns的总结(转)

    原文地址:http://www.cnblogs.com/ivictor/p/4834864.html Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定. 譬如我要启动一个ce ...

  10. Linux 基础教程 25-命令和文件查找

    which     不管是在Windows还是Linux系统中,我们都会偶尔执行一些系统命令,比如Windows常见的cmd.ping.ipconfig等,它们的位置都在%systemdrive%中. ...