thinkphp多层MVC用法分析


Posted in PHP onDecember 30, 2015

本文实例讲述了thinkphp多层MVC用法。分享给大家供大家参考,具体如下:

ThinkPHP支持多层设计。

1.模型层Model

使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层等不同的模型层可以在模块目录下创建Model,Logic,Service目录,把对用户表的所有模型操作分成3层。

1.Model/UserModel用于定义数据相关的自动验证,自动完成和数据存取接口

2.Logic/UserLogical用于定义用户相关的业务逻辑

3.Service/UserService用于定于用户相关的服务接口

这三个模型都继承Model类即可例如数据层Home/Model/UserModel.class.php

namespace Home\Model;
use Think\Model;
class UserModel extends Model{}

逻辑层Home/Logic/UserLogical.class.php

namespace Home\Logic;
use Think\Model;
class UserLogic extends Model{}

服务层Home/Service/UserService.class.php

namespace Home\Service;
use Think\Model;
class UserService extends Model{}

在调用的时候可以使用内置的D方法或M方法经行调用

D('User') //实例化UserModel
D('User','Logic') //实例化UserLogic
D('User','Service') //实例化UserService

调用默认的模型层Model下的数据存取接口类的时候没有第二个参数模型文件名称,默认的模型层是Model,也可以更改设置如下:

'DEFAULT_M_LAYER' =>  'Logic', // 更改默认的模型层名称为Logic

这样的话实例化方法就需要相应的修改了
D('User') //实例化UserLogic
D('User','Model') //实例化UserModel
D('User','Service') //实例化UserService

可以看到使用D('User')默认情况下会去实例化UserLogice类了,这个是很灵活的,如果我们数据验证,自动完成是在js里面完成的,而取数据是从service接口中完成的,这样完全可以只要一个Service层,其他的层就不需要了。

2.视图层View

视图层由模板和模板引擎组成,常见的第三方模板是.tpl,可以直接在模板中使用php代码,视图的多层可以简单的使用目录(模板主题)来区分,例如:

View/default/User/add.html
View/blue/User/add.html

复杂一点的多层视图还可以使用不同的视图目录来区分例如:

view 普通视图层目录
mobile 手机端访问视图层目录

这样不同的模板可以使用不同的页面风格,还可以默认视图目录,如下:

'DEFAULT_V_LAYER' => 'Mobile', // 默认的视图层名称更改为Mobile

3.控制器层Controller

ThinkPHP的控制器有两种类别,一种是核心控制器,一种是业务控制器,核心控制器在ThinkPHP目录下,例如thinkphp\ThinkPHP\Library\Think\Controller\HproseController.class.php,负责应用的调度控制,包括Http请求的拦截,转发,加载配置等。我们这里要讨论的是业务控制器,由用户自己定义的控制器类完成,多层业务控制器的实现原理和模型的分层类似,例如业务控制器和事件控制器,

Controller/UserController //用于用户的业务逻辑控制和调度
Event/UserEvent //用于用户的事件响应操作

事件这个还没有用过,看上去很高上大,web开发中的用户事件很少,大多数在js中完成。

访问控制器Home/Controller/UserController.class.php定义如下:

namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
}

事件控制器Home/Event/UserEvent.class.php的定义如下:

namespace Home\Event;
use Think\Controller;
class UserEvent extends Controller{
}

UserContrlller负责外部交互响应,通过URL请求响应,例如http://serverName/User/index,UserEvent负责内部事件响应并且只能在内部调用A('User','Event');同样我们可以设置默认的控制器层:

'DEFAULT_C_LAYER' => 'Event', // 默认的控制器层名称改为Event

内部和外部是隔离的,多层控制器也不是强制的,可以根据应用的需要自由的分层,控制器里可以根据需要调用不同的分层模型,也可以显示不同的分层视图,实现不同的主题。

在MVC的三层中,ThinkPHP并不依赖M和V,可以只有C或者只有V,用户只需要定义视图,在没有C的情况下也能自动识别,但是这种怪异的写法会让很多刚刚入门的程序员非常的迷惑。

多层设计在目前的项目中还没有用到,在.net项目中倒见到很多,下次用到再做补充。

希望本文所述对大家基于thinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php cookie 登录验证示例代码
Mar 16 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
php采集时被封ip的解决方法
Aug 29 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
PHP调用Linux的命令行执行文件压缩命令
Jan 27 PHP
PHP中的类型约束介绍
May 11 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PHP实现git部署的方法教程
Dec 19 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 PHP
thinkphp命名空间用法实例详解
Dec 30 #PHP
详解PHP中的null合并运算符
Dec 30 #PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 #PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 #PHP
分享PHP守护进程类
Dec 30 #PHP
如何写php守护进程(Daemon)
Dec 30 #PHP
PHP汉字转换拼音的函数代码
Dec 30 #PHP
You might like
php提取字符串中网站url地址的方法
2014/12/03 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
js三种排序算法分享
2012/08/16 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue中如何使用ztree
2018/02/06 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
2015毕业寄语大全
2015/02/26 职场文书
自我推荐信怎么写
2015/03/24 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL