1. ThinkPHP支持多层设计。
  2.  
  3. .模型层Model
  4.  
  5. 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层等不同的模型层可以在模块目录下创建ModelLogicService目录,把对用户表的所有模型操作分成3层。
  6.  
  7. .Model/UserModel用于定义数据相关的自动验证,自动完成和数据存取接口
  8.  
  9. .Logic/UserLogical用于定义用户相关的业务逻辑
  10.  
  11. .Service/UserService用于定于用户相关的服务接口
  12.  
  13. 这三个模型都继承Model类即可例如数据层Home/Model/UserModel.class.php
  14.  
  15. namespace Home\Model;
  16. use Think\Model;
  17. class UserModel extends Model{}
  18. 逻辑层Home/Logic/UserLogical.class.php
  19.  
  20. namespace Home\Logic;
  21. use Think\Model;
  22. class UserLogic extends Model{}
  23. 服务层Home/Service/UserService.class.php
  24.  
  25. namespace Home\Service;
  26. use Think\Model;
  27. class UserService extends Model{}
  28. 在调用的时候可以使用内置的D方法或M方法经行调用
  29.  
  30. D('User') //实例化UserModel
  31. D('User','Logic') //实例化UserLogic
  32. D('User','Service') //实例化UserService
  33. 调用默认的模型层Model下的数据存取接口类的时候没有第二个参数模型文件名称,默认的模型层是Model,也可以更改设置如下:
  34.  
  35. 'DEFAULT_M_LAYER'       =>  'Logic', // 更改默认的模型层名称为Logic
  36. 这样的话实例化方法就需要相应的修改了
  37.  
  38. D('User') //实例化UserLogic
  39. D('User','Model') //实例化UserModel
  40. D('User','Service') //实例化UserService
  41. 可以看到使用D('User')默认情况下会去实例化UserLogice类了,这个是很灵活的,如果我们数据验证,自动完成是在js里面完成的,而取数据是从service接口中完成的,这样完全可以只要一个Service层,其他的层就不需要了。
  42.  
  43.  
  44.  
  45. .视图层View
  46.  
  47. 视图层由模板和模板引擎组成,常见的第三方模板是.tpl,可以直接在模板中使用php代码,视图的多层可以简单的使用目录(模板主题)来区分,例如:
  48.  
  49. View/default/User/add.html
  50. View/blue/User/add.html
  51. 复杂一点的多层视图还可以使用不同的视图目录来区分例如:
  52.  
  53. view 普通视图层目录
  54. mobile 手机端访问视图层目录
  55. 这样不同的模板可以使用不同的页面风格,还可以默认视图目录,如下:
  56.  
  57. 'DEFAULT_V_LAYER'       =>  'Mobile', // 默认的视图层名称更改为Mobile
  58.  
  59.  
  60. .控制器层Controller
  61.  
  62. ThinkPHP的控制器有两种类别,一种是核心控制器,一种是业务控制器,核心控制器在ThinkPHP目录下,例如thinkphp\ThinkPHP\Library\Think\Controller\HproseController.class.php,负责应用的调度控制,包括Http请求的拦截,转发,加载配置等。我们这里要讨论的是业务控制器,由用户自己定义的控制器类完成,多层业务控制器的实现原理和模型的分层类似,例如业务控制器和事件控制器,
  63.  
  64. Controller/UserController //用于用户的业务逻辑控制和调度
  65. Event/UserEvent //用于用户的事件响应操作
  66. 事件这个还没有用过,看上去很高上大,web开发中的用户事件很少,大多数在js中完成。
  67.  
  68. 访问控制器Home/Controller/UserController.class.php定义如下:
  69.  
  70. namespace Home\Controller;
  71. use Think\Controller;
  72. class UserController extends Controller{
  73.  
  74. }
  75. 事件控制器Home/Event/UserEvent.class.php的定义如下:
  76.  
  77. namespace Home\Event;
  78. use Think\Controller;
  79. class UserEvent extends Controller{
  80. }
  81. UserContrlller负责外部交互响应,通过URL请求响应,例如http://serverName/User/index,UserEvent负责内部事件响应并且只能在内部调用A('User','Event');同样我们可以设置默认的控制器层:
  82.  
  83. 'DEFAULT_C_LAYER'       =>  'Event', // 默认的控制器层名称改为Event
  84. 内部和外部是隔离的,多层控制器也不是强制的,可以根据应用的需要自由的分层,控制器里可以根据需要调用不同的分层模型,也可以显示不同的分层视图,实现不同的主题。
  85.  
  86. MVC的三层中,ThinkPHP并不依赖MV,可以只有C或者只有V,用户只需要定义视图,在没有C的情况下也能自动识别,但是这种怪异的写法会让很多刚刚入门的程序员非常的迷惑。

thinkphp的mvc理解的更多相关文章

  1. ASP.NET MVC 理解MVC模式

    ASP.NET MVC 理解MVC模式 PS:MVC出来很久了,工作上一直没机会用,所以我也没去学.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各位园友的斧正. ...

  2. ThinkPHP 3 MVC模式和URL访问

    一.什么是MVC                 //了解    M -Model 编写model类 对数据进行操作    V -View  编写html文件,页面呈现    C -Controlle ...

  3. Java框架-Spring MVC理解001

    Spring MVC理解 1.servlet--Spring MVC的本质 2.Spring MVC其实是一个工具,具体的理解可以分为两步:第一步,了解这个工具是怎么创建出来的:第二步,了解这个工具是 ...

  4. ThinkPHP的MVC模式

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

  5. MVC理解(全程白话不拽词)

    我所发的所有博客只为了给想干程序员,但是基础没有或者很差,刚入职场的人 所有的观点不一定准确,我不懂的或者不理解的都会备注出来 先说MVC MVC理解为:M  =  Model  =  数据库表里面每 ...

  6. MVC 理解小谈

    1. 如何理解MVC MVC 是一种经典的设计模式,全名为 Model-View-Controller,即 模型-视图-控制器. 其中,模型 是用于封装数据的载体,其本质是一个普通的 Java Bea ...

  7. ThinkPHP之MVC与URL访问

    一.初探 我们在apache的www目录下创建一个文件夹,其命名为我们的应用名.然后通过入口文件生成我们的应用. 当我们用ThinkPHP创建好一个应用后,其目录结果如下所示 那么我们如何来访问我们应 ...

  8. Android进阶笔记07:Android之MVC 理解

     1. 为什么需要MVC ? 软件中最核心的,最基本的东西是什么?  答:是的,是数据.我们写的所有代码,都是围绕数据的.      围绕着数据的产生.修改等变化,出现了业务逻辑.      围绕着数 ...

  9. Angular的MVC理解--节自Adam Free的Pro angularv2

    1. 定义 Angular的核心是采用MVC模式,即Model-View-Controller,也即MVW,Model-View-Whatever. 如下图所示,借助于ASP.NET的MVC模式来描述 ...

随机推荐

  1. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  2. hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)

    题意: 求解最大递增子序列. 例如:3 1 3 2 输入 3  个数 1 3 2 则递增子序列有 {1} {3} {2} {1 3} {1 2} ,故输出子序列的最大和 4 解题思路: x[n](n个 ...

  3. ORA-00931: missing identifier ORA-06512: at "SYS.DBMS_UTILITY"

    Database db = DatabaseFactory.CreateDatabase();            string sql = "SELECT * FROM table&qu ...

  4. motto3

    在我看来,最努力的人不一定能收获最好的,但不努力的人是必定收获不到任何东西的. 所以,园主,你要会努力才行.否则,你会累死的. 用心去学,用脑去想,认真对待每一件事,聪明一点,不要太愚蠢.

  5. ExtJS学习之路第三步:理解引擎之下,ExtJS4中的类

    写写就发现,有些代码不查查源头,不明白是怎么回事?搜到这篇文章觉得还是收益匪浅,更容易读懂代码. Classes in Ext JS 4: Under the hood Countdown to Ex ...

  6. 我所使用的一个通用的Makefile模板

    话不多说,请看: 我的项目有的目录结构有: dirls/ ├── include │   └── apue.h ├── lib │   ├── error.c │   ├── error.o │   ...

  7. 读<你必须知道的.NET>IL指令笔记

    IL指令笔记: 1.newObj和initObj MSDN解释:newObj用于分配和初始化对象,而initObj用户初始化值类型 newObj解释: (1):从托管堆分配指定类型所需要的全部内存空间 ...

  8. subverison的安装与注意事项

    1.安装 :官网下载 http://blog.csdn.net/sinboy/article/details/4000524 http://sourceforge.net/projects/win32 ...

  9. Entity Framework在SaveChanges()之前拿到对象的自增长ID

    现有两张表A.B在一个dbContext中更新,且A表的ID为B的外键, Insert(A); B.aid=A.ID; Insert(B); SaveChanges() 按照这个顺序就可以了满足要求, ...

  10. django程序报错CSRF verification failed. Request aborted.

    django程序的html页面中form的method='post'的时候报错 Forbidden (403) CSRF verification failed. Request aborted.He ...