一、模型(Model)层
1、ThinkPHP支持多层Model,不同的模型层都继承自系统的Model类。
 
2、模型的多层通过目录结构和命名规范区分。
例如:在某个项目设计中需要区分数据层、逻辑层、服务层等不同的模型层,可以在模块目录下面创建ModelLogicService目录,把对用户表的所有模型操作分成三层:
1)数据层(Model/UserModel):用于定义数据相关的自动验证和自动完成和数据存取接口
2)逻辑层(Logic/UserLogic):用于定义用户相关的业务逻辑
3)服务层(Service/UserService):用于定义用户相关的服务接口等
这三个模型操作类统一都继承Model类。
 
数据层:Home/Model/UserModel.class.php
namespace Home\Model;
use Think\Model;
class UserModel extends Model{ }
 
逻辑层:Home/Logic/UserLogic.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方法调用:
D('User')           //实例化UserModel
D('User','Logic')   //实例化UserLogic
D('User','Service') //实例化UserService
默认的模型层是Model,这是因为在/ThinkPHP/Conf/convention.php文件里,默认的模型层名称是是Model:
'DEFAULT_M_LAYER'       =>  'Model', // 默认的模型层名称
 
如果更改默认的模型层名称为Logic:
'DEFAULT_M_LAYER'       =>  'Logic', // 默认的模型层名称
则实例化的时候需要改成:
D('User')           //实例化UserLogic
D('User','Model')   //实例化UserModel
D('User','Service') //实例化UserService
 
二、视图(View)层
1、视图层由模板和模板引擎组成,在模板中可以直接使用PHP代码。
 
2、视图的多层可以简单的通过目录(也就是模板主题)区分,例如:
View/default/User/add.html
View/blue/User/add.html
 
3、复杂一点的多层视图可以采用不同的视图目录来完成,这样做的好处是每个不同的视图层都可以支持不同的模板主题功能。例如:
view 普通视图层目录
mobile 手机端访问视图层目录
 
4、默认的视图层是View目录,可以在/ThinkPHP/Conf/convention.php文件里更改视图层名称:
'DEFAULT_V_LAYER' => 'Mobile', // 默认的视图层名称更改为Mobile
 
三、控制器(Controller)层
1、ThinkPHP的控制器层由核心控制器业务控制器组成。
  • 核心控制器由系统内部的App类完成,负责应用(包括模块、控制器和操作)的调度控制,包括HTTP请求拦截和转发、加载配置等。
  • 业务控制器则由用户定义的控制器类完成。
2、多层业务控制器的实现原理和模型的分层类似。
例如业务控制器和事件控制器:
Controller/UserController //用于用户的业务逻辑控制和调度
Event/UserEvent           //用于用户的事件响应操作
UserController负责外部交互响应,通过URL请求响应,例如 http://serverName/User/index;
UserEvent负责内部的事件响应,并且只能在内部调用,A('User','Event')
 
访问控制器 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{ }
 
3、默认的访问控制器层是Controller,我们可以在/ThinkPHP/Conf/convention.php文件里调整设置如下:
'DEFAULT_C_LAYER' => 'Event', // 默认的控制器层名称改为Event

ThinkPHP 3.2.3(四)架构之多层MVC的更多相关文章

  1. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  2. .Net机试题——编写一个BS架构的多层表结构的信息管理模块

      要求: 编写一个BS架构的多层表结构的信息管理模块,用户体验需要注意.包含错误处理,需要最终能完整的跑起来.页面可以不美化,但是整洁还是必须的.在不能完成详细功能需求的情况下优先保证基本功能. 1 ...

  3. SpringBoot微服务架构下的MVC模型总结

    SpringBoot微服务架构下的MVC模型产生的原因: 微服务概念改变着软件开发领域,传统的开源框架结构开发,由于其繁琐的配置流程 , 复杂的设置行为,为项目的开发增加了繁重的工作量,微服务致力于解 ...

  4. 架构模式:MVC与MVVM

    本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  6. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

  7. thinkphp 多层mvc

    hinkPHP基于MVC(Model-View-Controller,模型-视图-控制器)模式,并且均支持多层(multi-Layer)设计. 模型(Model)层 默认的模型层由Model类构成,但 ...

  8. Storm系列(十四)架构分析之Executor-输入和输出处理

    Executor的数据 mk-executor-data函数用于定义Executor中含有的数据. Executor的输入处理 根据executor-id从Worker的:executor-recei ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...

随机推荐

  1. Nginx与Lua利用fpm打成rpm包

    1.下载相关软件 需要软件有:Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安装文件 安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJITshell& ...

  2. PHP将图片二进制转换

    http://www.360doc.com/content/14/0325/10/947551_363526874.shtml

  3. 将 List<UserInfo>中的对象按照UserInfo.name进行分组

    package yq; import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List; import ...

  4. 添加 index_combine hint的索引

    想试验一下 index_combine这个hint,于是做了如下试验. 1.创建一个具有若干index的表 SQL> create table test as select object_id, ...

  5. VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法

    1.默认属性 VB6.0有默认属性的特性.当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性.在某些情形下,省略常用属性名,使代码更为精简. 因为CommandBu ...

  6. gravity与layout_gravity的区别

    android:gravivty 控件的内容显示位置 android:layout_gravity 控件在屏幕的布局位置,相对于容器或者父控件的位置

  7. 利用cytoscape做网络图

    首先做出下面的基因间相互关系图 1.准备sif文件 data.sif 网络数据文件 gene1 pp gene2 gene3 gene4 gene5 gene6 gene7 gene8 gene9 n ...

  8. JS对象深刻理解 - 2

    JavaScript prototype   用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性, ...

  9. Jquery实现图片轮换效果

    最近在看jquery书时,看到一个比较有趣的东西:图片轮换.这里和大家分享下我看完后写的一个demo.实现图片轮换要完成三部分模块:html部分.css部分.jqury部分.下面分步详细说明.1.ht ...

  10. DuiLib 源码分析之CDuiString

    duilib是一个比较常见的界面库,闲来无事看看别人写的代码,跟自己写的一比, 才看到了差距呀,感觉自己写的乱七八糟,keep moving CduiString是duilib提供的一个字符串类,功能 ...