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 相关文章推荐
Zend 输出产生XML解析错误
Mar 03 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
PHP 可阅读随机字符串代码
May 26 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
php for 循环使用的简单实例
Jun 02 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
php常用的工具开发整理
Sep 26 PHP
PHP7 foreach() 函数修改
Mar 09 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数组键值用法实例分析
2015/02/27 PHP
PHP _construct()函数讲解
2019/02/03 PHP
HTML Dom与Css控制方法
2010/10/25 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
实例讲解vue源码架构
2019/01/24 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
如何使用Python 打印各种三角形
2019/06/28 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
python如何操作mysql
2020/08/17 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
优秀应届毕业生自荐信
2013/11/16 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
Python time库的时间时钟处理
2021/05/02 Python
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技