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. leetcode917

    class Solution { public: string reverseOnlyLetters(string S) { int len = S.length(); queue<char&g ...

  2. jeesite快速开发平台(五)----用户-角色-部门-区域-菜单-权限表关系

    转自: https://blog.csdn.net/u011781521/article/details/78994904

  3. JAVA 获取文件的MD5值大小以及常见的工具类

    /** * 获取文件的MD5值大小 * * @param file * 文件对象 * @return */ public static String getMD5(File file) { FileI ...

  4. 迷你MVVM框架 avalonjs 0.93发布

    这段时间吸取@limodou, @东灵等人的意见,做了以下改进 重构isArrayLike,提高avalon.each的性能,原来avalon.each是依赖于isArrayLike来判定是循环普通对 ...

  5. linux命令之scp远程文件复制

    scp是linux中功能最强大的文件传输命令,可以实现从本地到远程以及远程到本地的轻松文件传输操作.下面简单的讲解一些关于scp命令的操作,给有用的人一些参考: 首先是本地到远程的操作:操作的格式如下 ...

  6. 在Spring使用junit注解进行单元测试

    在Spring中可以使用junit配合注解进行单元测试 一.常用注解 1.@RunWith(SpringJUnit4ClassRunner.class),让测试运行于spring测试环境2.@Cont ...

  7. ajax传递数组及后台接收

    ajax传递的是{"items":arr},其中arr=[]; 在后台String[] items=req.getParameterValues("items" ...

  8. js中with 用法

    with 语句用于设置代码在特定对象中的作用域. 它的语法: with (expression) statement例如: var sMessage = "hello"; with ...

  9. qt QTcpServer与QTcpSocket通讯

    分类: C/C++ TCP        TCP是一个基于流的协议.对于应用程序,数据表现为一个长长的流,而不是一个大大的平面文件.基于TCP的高层协议通常是基于行的或者基于块的.          ...

  10. 1 web应用-http协议-web框架

    web 应用 Web 应用程序是一种可以通过 Web 访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式 C/S.B/S.C/S ...