一、模型(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. Java 异常处理 练习2

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  2. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  3. 处理session跨域几种的方案

    常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态.两种情况:一种9streets.cn和a.9streets.cn之间,另一种是 ...

  4. MySQL为什么需要一个主键

    主键 表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号. 主键(primary key) 一列(或一 ...

  5. Netsuite > Hierarchy of transactions in Inventory cost calculation

    First in day worksheets + Purchase Transactions (Receipts, Bills, Adjustments, Assembly Builds) + Tr ...

  6. 遗传算法在JobShop中的应用研究(part 5:解码)

    解码操作是整个遗传算法最重要的一步,在这步里面我们利用配置文件中的信息将染色体解码成一个有向无环图. 在介绍解码操作之前我们先来看一下配置文件,在part1绪论中我们已经介绍了一个车间调度问题的基本信 ...

  7. 利用JS制作简便计算器

    var d; var a=prompt("请输入数字"); a=parseInt(a); if(isNaN(a)){ alert("請輸入正確數字"); } e ...

  8. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...

  9. 漂亮的Linux命令提示符

    漂亮的Linux命令提示符 每天面对着白底黑字(黑底白字)的命令行是否枯燥泛味呢?生活应给是五彩缤纷的,何不为单调无味的生活增添一抹色彩? 下面一起体验一下Linux命令行提示符惊险的整容之旅 惊鸿一 ...

  10. leveldb 学习。

    1)大概浏览了leveldb文档的介绍.本想逐步看代码,想想还是自己先实现一个看看如何改进. 2)完成了一个非常丑陋的初版,但是还是比初初版有进步. 3)key value的数据库,不允许有key重复 ...