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. 【333】Python3.6 格式化文本

    看如下例子进行体会: min_temperature = 0 max_temperature = 300 step = 20 # \t: A tab print('Fahrenheit\tCelsiu ...

  2. IronPython Architecture

    [IronPython] IronPython is an implementation of the Python programming language written by the CLR t ...

  3. Docker构建redis cluster集群

    准备工作 安装gcc ruby 解压编译redis Redis 是 c 语言开发的.安装 redis 需要 c 语言的编译环境.如果没有 gcc 需要在线安装. yum install gcc-c++ ...

  4. IT项目经理岗位职责(转)

    一.  项目经理岗位职责 1.  项目经理为整个项目的第一责任人. 2.  项目经理对<质量检查报告>中的所有细则负首要责任. 3.  项目经理必须有效掌控项目开发的各个环节,协助.指导项 ...

  5. Spring中的注解配置-注入bean

    在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean ...

  6. MacOS下打包Python应用

    在MacOS下开发的Python应用,不是Web Application,开发好以后,如何给用户使用呢?用户的操作系统也是MacOS 使用py2app打包        一.软件环境          ...

  7. loadrunner--vugen录制脚本提示“无Internet访问。您可能无法录制并执行业务进程”

    1.vugen录制脚本提示如下,为什么会提示这个呢?这个提示忽略会对录制脚本有影响吗?最好应该怎么操作? 惠普技术支持回复: 您可以试试,若点击“Yes”,是否可以继续录制网站?若可以的话,您也确定网 ...

  8. 如何用Word发布WordPress博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  9. Hdu1051 Wooden Sticks 2017-03-11 23:30 62人阅读 评论(0) 收藏

    Wooden Sticks Problem Description There is a pile of n wooden sticks. The length and weight of each ...

  10. 企业搜索引擎开发之连接器connector(十七)

    本文描述连接器的提供与外界交互的servlet接口,连接器与外部是通过xml格式数据交互的 1)  获取所有连接类型 提交地址:http://localhost:8080/connector-mana ...