PHP MVC 中的MODEL层
Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封
三、实现你的Mode层
Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封,进行他的设计的时候设计到三个个概念:
------Model类。是实体类。用来保存数据库表格的中一条记录的所有字段的数据。并且可以验证这条记录数据的完整性。
------ModelManager类。 是实体类的管理类。通常每一个实体类(Model)都要有一个对应的管理类(ModelManager)。管理类可以用来管理实体类里面的数据纪录(例如删除/添加/更改.....)。 但是ModelManager类不一定要有对应的Model类。
------db类。 用来管理对数据库的联接。 ModelManager类所有的对数据的操作。都是通过这个db类来实现的。 在整个MVC模式中。只有这个db类可以直接对数据库进行操作。同时也只有ModelManager类可以对db类进行调用。
看上去好象是比较麻烦。但是实际上并不复杂。这种Model层设计方式。和网上购物系统的购物车程序是极其相似的。Model可以看作是购物车里的单个商品的信息类。Manager可以看作是订单。 订单是用来管理采购的商品的。
下面是一个简单的例子。应该是比较典型的。着重看他的整个设计和流程的实现。仔细研究一下。其实不难。
注意:下面例子使用的所有的类和方法都是经过简化的。实际情况比这个要复杂的多。但是。作为一个实例已经是足够用了。
文件夹结构:
|- Db.php
|- Model.php
|- Manager.php
|- ModelTest1.php
|- ModelTest2.php
|- ModelTest3.php
|- ModelTest4.php
|- Model /
|- Model / ClassModel.php
|- Model / StudentModel.php
|- Model / ClassManager.php
|- Model / StudentManager.php
注意文件夹和文件名的大小写
内容:假设有一个数据库,保存在两张表,一张是class(班级)表格,一张是student(学生)的表格,
class表格字段: cls_id----------int--------not null
cls_name--------string-----not null
cls_address-----string-----null
student表格字段:stu_id----------int--------not null
stu_clsid-------int--------not null
stu_name--------string-----null
ClassModel.php 里面是class表的一个实体类ClassModel
ClassManager.php 里面是ClassModel的管理类ClassManager
StudentModel.php 里面是student表的一个实体类StudentModel
StudentManager.php 里面是StudentModel的管理类StudentManager
Db.php 里面是一个数据库操作管理类,他和里面用的接口和正常使用情况是一样的, 但是本例只是模拟的实现了这个借口.因此,可以在不用真实数据库的情况下运行.
文件0:(Model.php)Model层实体的基础类
<?php
//用来包装信息实体的基础类
class Model{
//这个实体类的数据,
//example: array("id"=>1, "name"=>"this is name");
var $data;
//这个实体类的数据约束信息,用来判断加入的$data数据的准确性
//see: ClassModel
var $match;
//与该实体对应的数据库中表的名称
var $table;
//初始化
function Model(&$data){
$this->data = &$data;
}
//设置该实体的某个数据是值
function set($key, $value){
$this->data[$key] = $value;
}
//获取该实体的某个数据
function get($key){
return $this->data[$key];
}
//获取该实体的全部数据
function getData(){
return $this->data;
}
//获取该实体的约束信息
function getMatch(){
return $this->match;
}
//验证实体数据的准确性和完整性
function isValid(){
foreach($this->match as $key=>$value){
if(!isset($value["null"]) && !isset($this->data[$key])) die("$key 的数值不能为空");
//.....可以在加其他的判断,例如是否超过如许的最大数值,或长度过长.....
}
}
}
?>
文件1:(Manager.php)Model层进行实体管理的基础类
<?php
//对实体信息进行管理的基础类
class Manager{
//数据库管理类对象
var $db;
//初始化
function Manager(){
$this->db = new Db();
}
//用来向数据库中插入实体信息
function insert(&$model){
$model->isvalid();
$table = $model->table;
$match = $model->getMatch();
$data = $model->getData();
$str1 = $str2 = array();
foreach($match as $key=>$value){
if(isset($data[$key])){
$str1[] = $key;
$str2[] = ($value["type"]=="C")? """.$data[$key].""": $data[$key];
}
}
$sql = "INSERT INTO $table (".implode(",", $str1).") VALUES(".implode(",", $str2).")";
return $this->db->execute($sql);
}
}
?>
文件2:(ClassModel.php)班级信息的实体类
<?php
//用来包装班级信息的实体类
class ClassModel extends Model{
var $data = array();
//$match中,
//type用来表示数据的类型(I表示整数, C表示是字符串)
//name用来表示在数据库表中的字段名
//null表示该字段的值是否准许为空
// (数组中有"null"=>true表示是准许为空,否则不能为空)
var $match = array("cls_id" => array("name"=>"cls_id", "type"=>"I"),
"cls_name" => array("name"=>"cls_name", "type"=>"C"),
"cls_address" => array("name"=>"cls_address", "type"=>"C", "null"=>true)
);
var $table = "class";
//初始化
function ClassModel(&$data){
parent::Model($data);
}
//用来获取这个班级的学生的信息
function getStudent(){
require_once "./Model/StudentManager.php";
$manager = new StudentManager();
$classId = $this->get("cls_id");
return $manager->getList($classId);
}
}
?>
文件3:(StudentModel.php)学生信息的实体类
<?php
//用来包装学生信息的实体类
class StudentModel extends Model{
var $data = array();
//$match中,
//type用来表示数据的类型(I表示整数, C表示是字符串)
//name用来表示在数据库表中的字段名
//null表示该字段的值是否准许为空
// (数组中有"null"=>true表示是准许为空,否则不能为空)
var $match = array("stu_id" => array("name"=>"stu_id", "type"=>"I"),
"stu_clsid" => array("name"=>"stu_clsid", "type"=>"I"),
"stu_name" => array("name"=>"stu_name", "type"=>"C", "null"=>true)
);
var $table = "student";
//初始化
function StudentModel(&$data){
parent::Model($data);
}
}
?>
文件4:(ClassManager.php)班级实体的管理类
<?php
//班级实体信息的管理类
class ClassModelManager extends Manager{
//初始化
function ClassModelManager(){
parent::Manager();
}
//获取班级列表
function &getList(){
$sql = "SELECT * FROM class";
return $this->db->query($sql);
}
//查找并返回一个班级的实体类
function &findOneModel($id){
$sql = "SELECT * FORM class WHERE cls_id=$id";
$data = $this->db->getOne($sql);
if($data==null) die("该班级不存在!");
require_once "./Model/ClassModel.php";
$model = new ClassModel($data);
return $model;
}
}
?>
文件5:(StudentManager.php)学生实体的管理类
<?php
//学生信息实体的管理类
class StudentManager extends Manager{
//初始化
function StudentManager(){
parent::Manager();
}
//获取某个班级的学生的列表
function &getList($classId){
$sql = "SELECT * FROM student WHERE stu_clsid=$classId";
return $this->db->query($sql);
}
}
?>
文件6:(Db.php)数据库联接管理类,用于共享并管理数据的访问。由于这个类涉及的内容不是本章要讨论的内容,所以这个类模拟了“真实的数据库管理类的方法”,借口是和正常的类是一样的,但是接口函数里面的内容是不对的,只是模拟的数据。网上有很多这种类的做法,可以自己到晚上找找,(**另外本系列文章的第二章里也有详细的介绍**)。
<?php
//数据库操作管理类
class Db{
//数据库联接
var $con;
//初始化
function Db(){
//$this->con=mysql_connect(********************);...........
}
//执行数据查询语句
function &query($sql){
//$result = mysql_query($sql); ..................
//return $result;
if($sql=="SELECT * FROM student WHERE stu_clsid=2")
return array("0"=>array("stu_id"=>1, "stu_clsid"=>2, "stu_name"=>"student1"),
"1"=>array("stu_id"=>2, "stu_clsid"=>2, "stu_name"=>"student2")
);
die("空班级");
}
//获取一条数查询结果
function getOne($sql){
//$result = mysql_query($sql); .............
//return $result[0];
if($sql=="SELECT * FORM class WHERE cls_id=1")
return null;
if($sql=="SELECT * FORM class WHERE cls_id=2")
return array("cls_id"=>2, "cls_name"=>"classname", "cls_address"=>"classaddress");
}
//执行数据库更新/添加/删除语句
function execute($sql){
//mysql_query($sql);
echo "<br>正在进行插入操作<br>...<br>插入操作完成<br>";
return true;
}
}
?>
测试文件一、(ModelTest1.php)(查询班级标号(cls_id)为2的班级的学生的名单)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$classId = 2;
require_once "./Model/ClassManager.php";
$manager = new ClassModelManager();
$model = $manager->findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "编号:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."<br>";
?>
返回的结果是:
编号:1 ------ 姓名: student1
编号:2 ------ 姓名: student2
测试文件二、(ModelTest2.php)(查询班级标号(cls_id)为1的班级的学生的名单)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$classId = 1;
require_once "./Model/ClassManager.php";
$manager = new ClassModelManager();
$model = $manager->findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "编号:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."<br>";
?>
返回的结果是:
该班级不存在!
测试文件三、(ModelTest3.php)(执行数据库的插入工作,向student表添加数据)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$data = array("stu_id"=>3, "stu_clsid"=>2, "stu_name"=>"student3");
require_once "./Model/StudentModel.php";
$model = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "<h2>插入操作成功</h2>": "<h2>插入操作失败</h2>";
?>
返回的结果是:
正在进行插入操作
...
插入操作完成
插入操作成功
测试文件四、(ModelTest4.php)(执行数据库的插入工作,向student表添加数据)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$data = array("stu_id"=>3, "stu_name"=>"student3");
require_once "./Model/StudentModel.php";
$model = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "<h2>插入操作成功</h2>": "<h2>插入操作失败</h2>";
?>
返回的结果是:
stu_clsid 的数值不能为空
结果分析:
StudentModel中"match"的规定stu_clsid的值是不能为空的,
而代码中代码中$data = array("stu_id"=>3, "stu_name"=>"student3");
缺少stu_clsid的值,因此不能通过数据的完整性校验,抱错.
PHP MVC 中的MODEL层的更多相关文章
- ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例
在实际的ASP.NET mvc项目开发中,有时会遇到一个参数是一个List.Dictionary等集合类型的情况,默认的情况ASP.NET MVC框架是怎么为我们绑定ASP.NET MVC的Actio ...
- ASP.NET MVC中对Model进行分步验证的解决方法
原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...
- asp.net MVC中的@model与Model
asp.net MVC中的@model与Model https://blog.csdn.net/ydm19891101/article/details/44301201 在MVC的实际使用中,我们经常 ...
- ASP.NET Core MVC 中的 Model 模型
ASP.NET Core MVC 中的 Model 我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示. MVC 中的模型包含一组表示数据的类和管理该数据的逻辑. ...
- 浅谈MVC中的service层(转)
概述 mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层 ...
- 关于MVC中模型model的验证问题
今天在做项目练习的时候发现,MVC中使用自带的模型验证时会提前显示在界面上,比如下面所示: 这是什么原因了,是因为我在表示get请求的action里面返回了其界面所显示使用的model,我们知道mvc ...
- Spring.NET在MVC中实现业务层和UI层解耦
最近在项目中用到了Spring.NET,使用它来实现业务层和UI层解耦.使用过程中难免遇到问题,现把遇到的一些问题整理出来,留作笔记. 使用的开发工具是vs2017,.netframework 4.6 ...
- MVC 中的Model对象
最近实在是太忙,客户丢了一个框架,没有任何说明文档,更没有所谓的技术支持,一直忙于学习,最后好歹还有点头绪,话不多说,MVC的学习是不能拉下的,就当前小白的我,认为MVC中的M并不是想象中的那样简单, ...
- MVC中的七层架构
工厂模式的七层架构 1.创建Model,实现业务实体. 2.创建IDAL,实现接口. 3.创建DAL,实现接口里的方法. 4.创建DBUtility,数据库操作类5.创建DALFactory,抽象工程 ...
随机推荐
- winSocket数据传输
服务器端: #include <WINSOCK2.H> #include <stdio.h> #pragma comment(lib,"ws2_32.lib" ...
- fibonacci 数列及其应用
fibonacci 数列及其延展 fibonacci计算 fibonacci数列是指 0,1,1,2,3,5,8,13,21……这样自然数序列,即从第3项开始满足f(n)=f(n-1)+f(n-2): ...
- css样式中遇到!important
链接: http://zhidao.baidu.com/link?url=XyYHS2l-bFkzEgMBWfbQYuEV4vmGz8kOhj-jDL_HBqu0KnVIBQJKvw5OOO-bVjv ...
- 本地计算机 上的 Redis Server 服务启动后停止
服务器上Redis服务安装正常..却启动不了.. 报错 : 本地计算机 上的 Redis Server 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止. 最后发现是Redis的配置 ...
- BAT command
http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html BAT常用命令 1.@ 它的作用是隐藏它后面这一行的命令本身(只能 ...
- zoj3811 Untrusted Patrol (dfs)
2014牡丹江网络赛C题 (第三水的题 The 2014 ACM-ICPC Asia Mudanjiang Regional First Round http://acm.zju.edu.cn/onl ...
- 移动端网站优化指南-WAP篇
转载:http://seofangfa.com/mobile-seo/mobile-seo-guide.html 1.域名优化:启用短域名,例如:m.abc.com,便于用户记忆,方便搜索蜘蛛查找,减 ...
- ASO优化总结(基于网络分享的知识总结归纳)
如何优化应用标题? 注意关键字的长度,尽量保证每一个关键字小于10个字符.保持快速更新,因为每次更新,你都将有机会删除表现不佳的关键字以 及增添新的关键字.在ASO中使用关键字的正确做法 标题,并非越 ...
- .Net Core 之 图形验证码
本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能. 通过测试的系统: Windows 8.1 64bit Ubuntu Server 16.04 LTS 64 ...
- 【AngularJS】—— 2 初识AngularJs(续)
前一篇了解了AngularJS的一些简单的使用,这里继续跟着w3c学习一下剩下的内容. 本篇根据w3cschool.cc继续学习AngularJS剩余的内容,包括: 1 事件 2 模块 3 表单 4 ...