ThinkPHP3.1新特性之多层MVC的支持

1.模型(Model)层:默认的模型层由Model类构成,但是随着项目的增大和业务体系的复杂化,单一的模型层很难解决要求,从3.1开始推出了多层Model的支持,设计思路很简单,不同的模型层仍然都继承自系统的Model类,但是在目录结构和命名规范上做了区分,例如在某个项目设计中需要区分数据层、逻辑层、服务层等不同的模型层,我们可以在项目的Lib目录下面创建Model、Logic和Service目录,把对用户表的所有模型操作分成三层:

数据层:Model/UserModel 用于定义数据相关的自动验证和自动完成和数据存取接口
逻辑层:Logic/UserLogic 用于定义用户相关的业务逻辑
服务层:Service/UserService 用于定义用户相关的服务接口等

而这三个模型操作类统一都继承Model类即可,这样对用户数据的操作就非常清晰,在调用的时候,也可以用内置的D方法很方便的调用:

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

对模型层的分层划分是很灵活的,开发人员可以根据项目的需要自由定义分层。

2.视图(View)层:由模板和模板引擎组成,在模板中可以直接使用PHP代码,模板引擎的设计会在后面讲述,通过驱动也可以支持其他第三方的模板引擎。视图的多层可以简单的通过目录区分,例如:

Tpl/default/User/add.html
Tpl/blue/User/add.html

3.控制器(Controller)层:ThinkPHP的控制器层由核心控制器和业务控制器组成,核心控制器由系统内部的App类完成,负责应用(包括模块和操作)的调度控制,包括HTTP请求拦截和转发、加载配置等,业务控制器则由用户定义的Action类完成。3.1版本开始增加了多层业务控制器的支持。其实现原理和模型的分层类似,例如业务控制器和事件控制器:

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

UserAction负责外部交互响应,通过URL请求响应,例如 http://serverName/User/index,而UserEvent 负责内部的事件响应,并且只能在内部调用

 A('User','Event');

所以是和外部隔离的。多层控制器的划分也不是强制的,可以根据项目的需要自由分层。控制器分层里面可以根据需要调用分层模型,也可以调用不同的目录的视图模板。
同时,R方法也可以支持多层控制器的调用了,增加了第三个参数表示控制器的层名称,例如:

R('User/register',array(15),'Event');

表示调用UserEvent控制器的register方法,并传入参数15.
在MVC三层中,ThinkPHP并不依赖M或者V,甚至可以只有C或者只有V,这个在ThinkPHP的设计里面是一个很重要的用户体验设计,用户只需要定义视图,在没有C的情况下也能自动识别。

(0)

相关推荐

  • ThinkPHP3.2.3数据库设置新特性

    ThinkPHP3.2.3版本数据库驱动采用PDO完全重写,配置和使用上面也比之前版本更加灵活和强大,我们来了解下如何使用. 首先,3.2.3的数据库配置信息有所调整,完整的数据库设置包括: 复制代码 代码如下: /* 数据库设置 */  'DB_TYPE'               =>  '',     // 数据库类型  'DB_HOST'               =>  '', // 服务器地址  'DB_NAME'               =>  '',       

  • ThinkPHP3.1之D方法实例详解

    D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下: D('[项目://][分组/]模型','模型层名称') 方法的返回值是实例化的模型对象. D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化. D方法最常用的用法就是实例化当前项目的某个自定义模型,例如: // 实例化User模型

  • 分享ThinkPHP3.2中关联查询解决思路

    不废话了,直接给大家贴代码了,代码很简单,都是比较常见的sql语句,具体内容请看下文. CREATE TABLE `test_avatar` ( `uid` int(11) unsigned NOT NULL DEFAULT '0', `avatar` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `test_avatar` VALUE

  • thinkphp3.2.2实现生成多张缩略图的方法

    本文实例讲述了thinkphp3.2.2实现生成多张缩略图的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: public function dz_upload() { //上传多张缩略图   上传2张缩略图     if (isset($_FILES['ori_img'])){     $upload = new \Think\UploadFile();// 实例化上传类     $upload->maxSize = 3000000 ;// 设置附件上传大小  C('UP

  • ThinkPHP3.2.2的插件控制器功能

    3.2.2版本开始支持插件控制器的调用,可以通过更加方便的URL地址访问到模块中某个插件定义的控制器. 当URL中传入插件控制器变量的时候,会自动定位到插件控制器中的操作方法. 插件控制器的变量由参数 VAR_ADDON 进行设置,默认为addon,例如我们在URL中传入: 复制代码 代码如下: http://serverName/Home/info/index/addon/SystemInfo 由于传入了addon参数,因此这里的User控制器并非原来的 复制代码 代码如下: Home/Con

  • ThinkPHP的MVC开发机制实例解析

    ThinkPHP是目前国内应用非常广泛的一款MVC开发框架.本文就以实例形式解析ThinkPHP的MVC开发机制.相信会给大家一定的启发作用.具体分析如下: 一.概述: MVC框架解析如下: M  Model层    模型:就是数据库操作类(通过数据库操作类去操作各个表)         V  View层     视图:指模版.       C  Control层  控制器:就是通过控制器来实现模版,模型之间的控制关系. 二.实例分析: 1.ACTION 控制器: 位置 D:\www\aoli\

  • thinkphp多层MVC用法分析

    本文实例讲述了thinkphp多层MVC用法.分享给大家供大家参考,具体如下: ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层等不同的模型层可以在模块目录下创建Model,Logic,Service目录,把对用户表的所有模型操作分成3层. 1.Model/UserModel用于定义数据相关的自动验证,自动完成和数据存取接口 2.Logic/UserLogical用于定义用户相关的业务逻辑

  • ThinkPHP3.1新特性之多层MVC的支持

    1.模型(Model)层:默认的模型层由Model类构成,但是随着项目的增大和业务体系的复杂化,单一的模型层很难解决要求,从3.1开始推出了多层Model的支持,设计思路很简单,不同的模型层仍然都继承自系统的Model类,但是在目录结构和命名规范上做了区分,例如在某个项目设计中需要区分数据层.逻辑层.服务层等不同的模型层,我们可以在项目的Lib目录下面创建Model.Logic和Service目录,把对用户表的所有模型操作分成三层: 数据层:Model/UserModel 用于定义数据相关的自动

  • ThinkPHP3.1新特性之对Ajax的支持更加完善

    ThinkPHP3.1版对AJAX的支持更加完善了,具体表现在: 1.判断AJAX方式改进 现在可以直接使用常量IS_AJAX来判断是否AJAX方式请求,用来取代之前的Action类的isAjax方法,优势是可以在任何代码里面进行判断.而Action类的error和success方法内置就支持对AJAX自动判断支持. 2.ajaxReturn方法完善 原来的ajaxReturn方法只能返回固定结构的数据,包括data.status和info索引信息,如果需要扩展额外的返回数据信息,只能通过aja

  • ThinkPHP3.1新特性之对分组支持的改进与完善概述

    ThinkPHP3.1版本对分组的支持如了如下改进: 每个分组支持独立的空模块 ThinkPHP3.0及以前版本的分组不支持定义独立的空模块,空模块EmptyAction只能放置在分组目录外层,而ThinkPHP3.1版则改进了每个分组可以定义独立的空模块,对于有不同分组不同空模块需求的情况就方便了. 公共Action和Model类优先加载分组目录 ThinkPHP3.0版本分组如果要继承一个公共的Action类或者Model类分组目录下面的,这个继承的公共类只能放到分组目录外层,否则就要手动用

  • 深入Java7的一些新特性以及对脚本语言支持API的介绍

    1.switch条件语句中可以加入字符串了,实现方法是利用了字符串的hashcode()值作业真正的值2.增加了一种可以在字面量中使用的进制,二进制,通过在数字前面加"0b"或"0B"3.在数字字面量中使用下划线来分隔数字方便阅读,不影响数值大小.基本原则是前后都是数字的才可以出现下划线4.java7对异常做了两个改动: 4.1.支持在一个catch子句中同时捕获多个异常,另外一个是在捕获并重新抛出异常时的异常类型更加精确.java7中Throwable类增加add

  • ThinkPHP3.1新特性之Action参数绑定

    ThinkPHP3.1版的Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法.这一新特性对以往的操作方法使用没有任何影响,你也可以用新的方式来改造以往的操作方法定义. Action参数绑定的原理是把URL中的参数(不包括分组.模块和操作地址)和控制器的操作方法中的参数进行绑定.例如,我们给Blog模块定义了两个操作方法read和archive方法,由于read操作需要指定一个id参数,archive方法需

  • ThinkPHP3.1新特性之字段合法性检测详解

    ThinkPHP3.1版增加了表单提交的字段合法性检测,可以更好的保护数据的安全性.这一特性是3.1安全特性中的一个重要部分. 表单字段合法性检测需要使用create方法创建数据对象的时候才能生效,具体有两种方式: 一.属性定义 可以给模型配置insertFields 和 updateFields属性用于新增和编辑表单设置,使用create方法创建数据对象的时候,不在定义范围内的属性将直接丢弃,避免表单提交非法数据. insertFields 和 updateFields属性的设置采用字符串(逗

  • ThinkPHP3.1新特性之查询条件预处理简介

    以往的ThinkPHP3.0版本对数组方式的查询条件会进行安全过滤(这是由于3.0强制使用了字段类型检测,所以数组方式的查询条件会强制转换为字段的设定类型),但是3.0版本并不支持字符串条件的安全过滤.而ThinkPHP3.1版本则增加了对条件字符串进行预处理的支持,让ORM的安全性更加得以保证. 一.使用where方法 Model类的where方法支持字符串条件预处理,使用方式: $Model->where("id=%d and username='%s' and xx='%f'&quo

  • ThinkPHP3.1新特性之G方法的使用

    长期以来ThinkPHP都是需要通过debug_start.debug_end方法甚至Debug类才能完成那些调试的功能,而在ThinkPHP3.1版本中,这些复杂的功能被一个简单的G方法取代了,这不可不谓是一次华丽升级. G方法的作用包括标记位置和区间统计两个功能,下面来看下具体用法: 1.标记位置 G方法的第一个用法就是标记位置,例如: G('begin'); 表示把当前位置标记为begin标签,并且记录当前位置的执行时间,如果环境支持的话,还能记录内存占用情况.可以在任何位置调用G方法标记

  • ThinkPHP3.1新特性之内容解析输出详解

    以往版本的ThinkPHP中页面输出的过程是读取模板文件,然后进行模板解析(也支持调用第三方模板引擎解析),但是有一些情况,我们并没有定义模板文件,或者把模板文件保存在数据库里面,那么这种情况下进行页面输出的时候,我们是无法进行模板文件读取的,ThinkPHP3.1版本则针对这样的情况增加了内容解析输出的功能. 内置的模板引擎也进行了完善,如果传入的模板文件不存在的话,则会认为是传入的模板解析内容,因此,ThinkPHP3.1版的View类和Action类也做了一些相应的改进. display方

  • ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码

    在ThinkPHP3.1版本之前,如果需要设置自动验证或者自动完成,必须定义在模型中,或者通过setProperty方法动态设置属性来完成,但是这样做的缺点是不太方便动态改变和调整 . ThinkPHP3.1版本在模型类中增加auto和validate两个连贯操作,用于动态设置自动完成和自动验证规则,现在可以在Action中使用,示例代码如下: $validate = array( array(verify,require,验证码必须!), array(name,,帐号名称已经存在!,0,uni

随机推荐