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如何得到当前页和上一页的地址?
Nov 27 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
使用php实现截取指定长度
Aug 06 PHP
php加密解密实用类分享
Jan 07 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 PHP
抛弃 PHP 代价太高
Apr 26 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
PHP异常类及异常处理操作实例详解
Dec 19 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学习的路线图
2013/07/10 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
php简单压缩css样式示例
2016/09/22 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
python中的错误处理
2016/04/10 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
django删除表重建的实现方法
2019/08/28 Python
Python sep参数使用方法详解
2020/02/12 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
python em算法的实现
2020/10/03 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
运动会800米加油稿
2014/02/22 职场文书
团队口号大全
2014/06/06 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
2016年会开场白台词
2015/06/01 职场文书
八月迷情观后感
2015/06/11 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技