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, -) == '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)的更多相关文章
- cocos2dx之lua项目开发中MVC框架的简单应用
**************************************************************************** 时间:2015-03-31 作者:Sharin ...
- 谈谈service层在mvc框架中的意义和职责
mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层设计, ...
- 简述MVC框架模式以及在你(Android)项目中的应用
标题是阿里电话面试的问题,一直以为自己很清楚MVC模式,结果被问到时,居然没法将MVC和Android中各个组件对应起来,所以,面试肯定挂了,不过面试也是学习的一种方式,可以知道大公司看中什么,以及自 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...
- 找到MVC框架中前端URL与后端同步的解决方案
基本思路: 先用URL标签生成完整的URL字符,前端动态参数的部分以适配符先填充,最后动态参数利用正则匹配进行替换. 这种方式,可以在各种MVC框架中适用,妙. 不废话,上码. var url = & ...
- 2014-07-30 MVC框架中对SQL Server数据库的访问
今天是在吾索实习的第16天.我自己主要学习了基于MVC框架的系统的开发时,对SQL Server数据库的相关访问.其步骤如下: 第一步,在Models文件夹中创建一个类,并命名为Movies.cs,如 ...
- [原]命令模式在MVC框架中的应用
其实在项目开发中,我们使用了大量的设计模式,只是这些设计模式都封装在框架中了,如果你想要不仅仅局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之一就是命令模式,先来看看模式是如何 ...
- 命令模式在MVC框架中的应用
事实上在项目开发中,我们使用了大量的设计模式,不过这些设计模式都封装在框架中了,假设你想要不只局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之中的一个就是命令模式,先来看看模式 ...
- 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署
用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...
随机推荐
- 迷你MVVM框架 avalonjs 1.3.4发布
发现一个以前从来没发现的大BUG,紧急发布此版本. fix getEachProxy BUG,此BUG会导致监控数组在删除某元素然后再添加元素时出现问题. avalon ms-on-*绑定添加一个钩子 ...
- onItemLongClick+onCreateContextMenu实现长按ListItem弹出不同菜单
个ListActivity,长按不同的item弹出的菜单不一样 参照
- push和pop指令的使用
- 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 ...
- Emacs中编辑保存makefile文件时会错误地将TAB转成空格的解决方法
问题描述 我的Emacs使用了Purcell的配置,在其配置中使用了whitespace-cleanup,且通过在.emacs.d/lisp/init-edit-utils.el中设定: (requi ...
- Windows pip安装失败:no module named pkg_resources
通常是Setuptools安装出错,下载以下ez_setup.py文件后,先执行:ez_setup.py -U setuptools 重新安装setuptools 通过此ez_setup.py pip ...
- Golang之方法(自定义类型,struct)
方法的使用,请看本天师的代码 //Golang的方法定义 //Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,不仅仅是struct //定义:func (recevier ...
- js中 new Date()使用说明
var myDate = new Date(); // myDate.getYear(); //获取当前年份(2位)(该方法获取年份,涉及到浏览器兼容问题,所以不推荐使用!) // myDate.ge ...
- docker 关于volumns的总结(转)
原文地址:http://www.cnblogs.com/ivictor/p/4834864.html Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定. 譬如我要启动一个ce ...
- Linux 基础教程 25-命令和文件查找
which 不管是在Windows还是Linux系统中,我们都会偶尔执行一些系统命令,比如Windows常见的cmd.ping.ipconfig等,它们的位置都在%systemdrive%中. ...