1. 前言
在我们以前的代码中,使用smarty编写程序,程序中的模板文件其实就是View,php文件则是Controller与Model的综合,现在要做的就是从中抽取除模型层,那么MVC的架构就可以了。
2. 如何创建模型层
模型层如何创建呢?
所谓模型层,就是上篇文章最后一张图中的 model 目录
模型层的主要作用是操作数据库,准确的说,其实操作的是数据库的表,所以我们的原则是
- 模型层中的一个类对应的是数据库中的一张表
- 模型层中的方法主要的作用是对表中的数据进行增加、伤处、修改、查询等操作
模型层中的类的命名应该遵循如下的原则
- 表名+Model.class.php。Model后缀的作用是为了通过名字区分类是否模型层的类
- 模型名称应使用大驼峰写法,如UserModel.class.php、UserItemModel.class.php
3. 创建模型类
3.1 准备数据库
新建news数据库,作为新闻系统的数据库
编写sql语句,创建表
/*
* users:id、username、pwd、realname
* news_type:id、title、create_time
* news:id、title、des、content、type_id、user_id、create_time
*/
-- 创建用户表
create table users(
id int primary key auto_increment comment '主键id',
username varchar(50) not null comment '用户名',
pwd varchar(100) not null comment '密码',
realname varchar(50) comment '真实姓名'
)
-- 创建新闻类型表
create table news_type(
id int primary key auto_increment comment '主键、类型id',
title varchar(50) not null comment '类型名称',
create_time int comment '创建时间'
);
-- 创建新闻表
create table news(
id int primary key auto_increment comment '新闻id、主键',
title varchar(100) not null comment '新闻标题',
des varchar(200) not null comment '新闻简介',
content text not null comment '新闻内容',
type_id int not null comment '新闻所属的类型id',
user_id int comment '发布此新闻的用户的id',
create_time int comment '新闻的发布时间'
);
3.2 创建模型类
项目中使用PDO的方式操作数据库,所以将原来封装好的PDO操作类和接口也拷贝到model目录中
然后再为数据库中的三张表创建对应的模型类
模型类要操作数据库,所以首先要连接数据库,我们将连接数据的代码写倒构造函数中
以UsersModel模型类为例
<?php
require_once 'PdoDAO.class.php';
class UsersModel
{
private $dao;
public function __construct()
{
//因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项
$config = [
'dbname'=>'test'
];
$this->dao= PdoDAL::getSingleInstance($config);
}
}
也可以新建一个initDao方法,将初始化数据库连接的代码放到此方法中,然后再构造函数中调用,这样构造函数中的代码更加精简,因为后续会再构造函数中写其他代码
<?php
require_once 'PdoDAO.class.php';
class UsersModel
{
private $dao;
public function __construct()
{
$this->initDao();
}
private function initDao()
{
//因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项
$config = [
'dbname' => 'test'
];
$this->dao = PdoDAL::getSingleInstance($config);
}
}
在模型类中加入方法,用于向表中插入数据
/**向users表中增加数据
* @return mixed 增加成功返回true,增加失败返回false
*/
public function users_add(){
$sql="insert into users(username,pwd,realname) values('yhb','111111','姚宏波')";
return $this->dao->query($sql);
}
在模型类中加入 users_select 方法,用于查询所有数据
/**查询users表中的所有数据
* @return array 查询数据的二维数组
*/
public function users_select(){
$sql="select * from users";
return $this->dao->fetchAll($sql);
}
自己再编写删除和更新方法
在网站根目录下新建demo1.php,测试模型类
require_once './model/UserModel.class.php';
$user=new UserModel();
$res=$user->users_add();
if ($res){
echo "success";
}else{
echo 'faild';
}
3.3 为其他模型类编写代码
仿照UsersModel类,为另外两个模型类编写代码,代码省略。。。。
4. 创建模型基类
观察上面创建的三个模型基类,发现构造函数部分是重复代码,也就是每个类中都有如下代码,用于初始化数据库连接对象
private $dao;
public function __construct()
{
$this->initDao();
}
private function initDao()
{
$config = [
'dbname' => 'news'
];
$this->dao = PdoDal::getSingleInstance($config);
}
而且随着模型类的增多,重复代码会越来越多,这对于后期的维护比较麻烦
最好是将数据库初始化代码放到一个地方,这样维护起来方便
我们的策略是创建模型基类
在model中新建Model.class.php
<?php
require_once 'PdoDAO.class.php';
class Model{
//为了在派生类中使用,这里修饰符要改成protected
protected $dao;
public function __construct()
{
$this->initDao();
}
private function initDao()
{
//因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项
$config = [
'dbname' => 'test'
];
$this->dao = PdoDAL::getSingleInstance($config);
}
}
然后UsersModel和另外两个模型类都继承此基类
以UsersModel类为例
<?php
require_once 'Model.class.php';
class UsersModel extends Model
{
public function users_add()
{
$sql = "insert into users values('libai','libai','李白')";
return $this->dao->query($sql);
}
}
5. 工厂类创建模型对象
模型类在外部使用时,需要 实例化
同一个模型类可能在很多页面都需要实例化
如果某一天,模型类的构造方法发生更改,参数个数发生变化,那么所有使用此模型类的地方就都要更改,这样维护起来很麻烦
我们还是希望能够一次更改,处处生效
解决方案就是使用工厂类创建类的对象,所有页面都调用这个类中的方法获取创建的对象
class Factory{
public static function M($classname){
static $model_list=array();
if (!isset($model_list[$classname])){
require_once $classname.".class.php";
$model_list[$classname]=new $classname;
}
return $model_list[$classname];
}
}
总结:
1)此方法返回的时单例模式的对象
2)此方法在使用require_once 引入文件时考虑并不周全
下面可以新建一个php文件,使用此工厂类的方法创建对象
require_once 'model/Factory.php';
$user1=Factory::M("UsersModel");
var_dump($user1);
echo '<br>';
$user2=Factory::M("UsersModel");
var_dump($user2);
echo '<br>';
$user3=Factory::M("UsersModel");
var_dump($user3);
通过输出结果,我们发现创建的是一个对象 |