MVC框架的学习总结

自己简单的总结下 之后就开始代码审计 好好学习多种MVC的框架的写法

视图View

代表用户交互的页面、可以包含HTML界面、Smarty模板等和界面相关的元素。MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的点击、拖动等事件的处理,而不包括在视图上的业务流程处理。业务流程会交给模型层(Model)处理。

模型Model

模型层是对业务流程、状态的处理以及业务规则的指定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图的请求处理数据,返回最终的处理结果。业务模型还有一个很重要的模型–数据模型,数据模型主要指实体对象的数据保存(持久化)。比如将一张订单保存到数据库,从数据库获取订单,所有和数据库相关的操作限定在该模型中。

控制器Controller

控制层是View层和Model层之间的一个桥梁,接收到用户的请求,将模型和视图匹配在一起,共同完成用户的请求。比如,用户点击一个链接,控制层接收到请求后,把信息传递给模型层,模型层处理完成之后返回视图给用户。

首先我认为这个MVC框架是一个高效率 高整合性的框架 有便于处理与维护 之后需要添加的方法 只需要在相应的类中添加就行

首先 基础模型类 是为了模型类最基础 把最基础,重复的一些东西放在基础模型类中 类似于一些数据库的配置文件、连接 放进去

模型类(按数据表划分) 专门对于一个对象的数据处理 其中要加载基础模型类(与数据库进行连接) 我的理解就是专门用来提供方法

基础控制器类 跟基础模型类的功能差不多 都是提供底层类似的操作 方便有效率的处理

控制器类(按功能划分)通过单例的工厂模式 然后生成的对象 用于调用模型类中的功能 我的理解就是调控动作

单例工厂类 的作用就是来储存类的对象 现在我的理解就是来返回一个对象 防止用户来调用生成对象 (安全处理)

一个MVC框架里面 会有一个入口文件 也称作前端控制器、请求分发器 因为调用的时候其实都是最先通过index.php文件里头

用过URL的变化 index.php 会有类似的接受参数 代表着平台、对象、方法的调用 这些被分作为分发参数

在这里插入图片描述
为了更方便的包含文件 处理文件 让整个框架变的更有效率 所以采取了自动加载类文件(直接自动加载框架中的类文件)
当URL接受到相应的分发参数的时候 通过自动加载类文件 会自动去包含相应的类文件

可以在入口文件定义好各目录的常量 这样方便处理

目录结构

application – 应用代码

应用代码比较重要 大致分为 后台目录、配置目录、前台目录
后台目录、配置目录、前台目录还可以继续细分

例如
后台目录----> 控制器类目录 模型类目录 视图目录
前台目录----> 控制器类目录 模型类目录 视图目录
配置文件目录----> 存放一些需要调用的数据库配置信息之类的

config – 程序配置或数据库配置

frame - 框架核心目录 框架的核心类 类似于 上传类 基础模型类 基础控制器类 工厂类 分页类等等的核心文件

public – 静态文件 存放一些公共的JS、CSS文件

Vendor - 存放插件 类似需要的smarty引擎模板 之类的

index.php?p=平台&c=控制器&a=动作
一个完整的MVC请求 在指定的平台中的控制器里面的动作由分发参数所传出来的 由控制器所接受其中的参数 然后经过自动加载类 判断其所需要的类文件

public static function autoload($class_name) {
	// 先把已经确定的核心类放到一个数组里面
	$frame_class_list = array(
		// '类名'	=>	'类文件地址'
		'Controller'=> FRAME_DIR . 'Controller.class.php',
		'Model'		=> FRAME_DIR . 'Model.class.php',
		'Factory'	=> FRAME_DIR . 'Factory.class.php',
		'MySQLDB'	=> DAO_DIR . 'MySQLDB.class.php',
		'PDODB'		=> DAO_DIR . 'PDODB.class.php',
		'I_DAO'		=> DAO_DIR . 'I_DAO.interface.php',
		'Smarty'	=> SMARTY_DIR . 'Smarty.class.php',
		'Captcha'	=> VENDOR_DIR . 'Captcha.class.php',
		'Upload'	=> FRAME_DIR . 'Upload.class.php',
		'Page'		=> FRAME_DIR . 'Page.class.php',
		'Image'     => FRAME_DIR . 'Image.class.php',
	);
	// 判断是否为核心类
	if(isset($frame_class_list[$class_name])) {
		// 说明是核心类
		include $frame_class_list[$class_name];
	}
	// 判断是否为控制器类,截取后10个字符进行匹配
	elseif(substr($class_name, -10) == 'Controller') {
		// 说明是控制器类,应该在当前平台的Controller目录下进行加载
		include CURRENT_CON_DIR . $class_name . '.class.php';
	}
	// 判断是否为模型类,截取后5个字符进行匹配
	elseif(substr($class_name, -5) == 'Model') {
		// 说明是模型类,应该在当前平台的Model目录下进行加载
		include CURRENT_MODEL_DIR . $class_name . '.class.php';
	}
}
	private static function initAutoload() {
	spl_autoload_register(array(__CLASS__, 'autoload'));
}

然后请求分发 new一个所需要的控制器的类文件 $controller = new $controller_name; 然后由控制器调用其中的动作$controller->$action_name()

private static function initDispatch() {
		// 先确定控制器类的名字
		$controller_name = CONTROLLER . 'Controller';
		// 实例化控制器类
		$controller = new $controller_name; // 可变类
		// 先拼凑出当前动作的名字
		$action_name = ACTION . 'Action';
		// 调用方法
		$controller->$action_name();// 可变方法
	}
}

然后在模型类中 (这里就举例一个模型类的文件)

	public function insertArt($art) {
		// 通过数组得到多个变量
		extract($art);
		// 完善其他数据表数据
		$addtime = time();
		// 入库
		$sql = "insert into bg_article values (null, $cate_id, '$title', '$thumb', '$art_desc', '$content', '$author', default, default, $addtime, default, default)";
		return $this->dao->my_query($sql);
	}

这个方法就在模型类中实现(对相关的数据库的操作) 然后通过Smarty分配变量 在继续到视图文件 xxx.html

一个完整的MVC请求就是这样(emm 就是个人的理解 自己只是记录下 如果说错了 麻烦指点下)

多个页面可能由相同的功能 所以在一个页面中 我们不止是需要一个模型类的实例化 可能还需要多个模型类的实例化

猜你喜欢

转载自blog.csdn.net/q1352483315/article/details/89460760
今日推荐