一、概念
应用:基于同一个入口文件访问的项目称之为一个应用。
模块:一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录,是一个包含配置文件、函数文件和MVC文件(目录)的集合。
控制器:每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。
操作:每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元。
 
二、典型的URL访问规则
http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]
 
三、模块设计
一个应用目录下面的模块目录结构如下,每个模块可以方便卸载和部署,并且支持公共模块。只要应用目录下面存在模块目录,该模块就可以访问。
Application      默认应用目录(可以设置)
├─Common         公共模块(不能直接访问)
├─Home           前台模块
├─Admin          后台模块
├─...            其他更多模块
├─Runtime        默认运行时目录(可以设置)
 
每个模块是相对独立的,其目录结构如下:
├─Module         模块目录
│  ├─Conf        配置文件目录
│  ├─Common      公共函数目录
│  ├─Controller  控制器目录
│  ├─Model       模型目录
│  ├─Logic       逻辑目录(可选)
│  ├─Service     Service目录(可选)
│  ... 更多分层目录可选
│  └─View        视图目录
 
四、公共模块Common
Common模块本身不能通过URL直接访问,公共模块的其他文件则可以被其他模块继承或者调用。
手册说,访问所有的模块之前都会首先加载公共模块下面的配置文件(Conf/config.php)和公共函数文件(Common/function.php),但并没有找到function.php文件。
 
手册说, 公共模块的位置可以通过在入口文件中定义COMMON_PATH常量来改变。
define('COMMON_PATH','./Common/');
在入口文件中定义该常量后,其应用目录结构变成:
www  WEB部署目录(或者子目录)
├─index.php       入口文件
├─README.md       README文件
├─Common          应用公共模块目录     // 定义之后,Application目录下面不再需要Common目录了
├─Application     应用模块目录
├─Public          应用资源文件目录
└─ThinkPHP        框架目录
但实际操作中,目录结构并没有变化。
 
五、自动生成模块目录
1、生成一个模块
例如,如果需要生成一个Admin模块用于后台应用,在应用入口文件中定义如下:
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
然后访问入口文件http://localhost/ThinkPHP-3.2.3/index.php, 会生成Admin模块的目录,并生成一个默认的控制器类Admin\Controller\IndexController
这个时候访问http://localhost/ThinkPHP-3.2.3/index.php/home/index/index,报错:
需要删除或注释掉那段常量定义的语句define('BIND_MODULE','Admin'); 才能正常访问Home模块。
 
同时发现一个问题:
自动生成模块目录时,define('BIND_MODULE','Admin');语句要放到require './ThinkPHP/ThinkPHP.php';上面,否则不会生成模块。
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
生成后,访问http://localhost/ThinkPHP-3.2.3/index.php没有问题,是Admin模块默认的“欢迎使用ThinkPHP页面”。
但是访问http://localhost/ThinkPHP-3.2.3/index.php/Admin/Index/index会报错
需要将define('BIND_MODULE','Admin');语句要放到require './ThinkPHP/ThinkPHP.php';下面,才能正常访问。
 
2、生成多个控制器类和模型类
如果需要生成更多的控制器类,可以定义BUILD_CONTROLLER_LIST常量,例如:
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');     // 模型类为BUILD_MODEL_LIST
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
问题1:访问后并没有生成如手册所说的控制类
Admin\Controller\IndexController
Admin\Controller\UserController
Admin\Controller\MenuController
问题2:重新搭ThinkPHP框架后,第一次访问入口文件后生成了多个控制类,但是再想生成别的控制类,依然失败。
百度了这个问题,有人也遇到与我类似的问题,解决方法是可以将已经生成的模块删除,然后重新访问入口文件,就可以生成该模块和对应的多个控制类了。
 
3、手动生成控制器类和模型类
手动调用Think\Build类的方法来生成控制器类和模型类,例如:
// 生成Admin模块的Role控制器类                          or 模型类
// 默认类库为Admin\Controller\RoleController           or Admin\Model\RoleModel
// 如果已经存在则不会重新生成
\Think\Build::buildController('Admin','Role');        or \Think\Build::buildModel('Admin','Role');
报错:Fatal error: Class 'Think\Build' not found in D:\xampp\htdocs\ThinkPHP-3.2.3\index.php on line 25
调试时发现:调用Think\Build类中方法的语句应放在引用ThinkPHP入口文件语句(require './ThinkPHP/ThinkPHP.php'; )的下面。
 
调用Think\Build类的方法还可以写成:
require './ThinkPHP/ThinkPHP.php';
 
include './ThinkPHP/Library/Think/Build.class.php';
$build = new \Think\Build();
$build->buildController('Admin','Role');
 
六、禁止访问模块
默认配置中是禁止访问Common模块和Runtime模块(Runtime目录是默认的运行时目录)。
手册说,可以增加其他的禁止访问模块列表:
// 设置禁止访问的模块列表
'MODULE_DENY_LIST'      =>  array('Common','Runtime','Api'),
设置后,Api模块不能通过URL直接访问。
一开始不知道这个配置是需要在入口文件里自定义还是在Application/Common/Conf下的config.php文件里定义,后来在/ThinkPHP/Conf/convention.php文件里找到了这个配置。
 
把自己生成的Admin模块添加进去,
访问http://localhost/ThinkPHP-3.2.3/index.php/Admin/Index/index,无法加载Admin模块,说明禁止访问模块成功。
 
七、设置访问列表
如果应用下面模块比较少,还可以设置允许访问列表和默认模块,这样可以简化默认模块的URL访问。
'MODULE_ALLOW_LIST'   =>    array('Home','Admin','User'),
'DEFAULT_MODULE'      =>    'Home',
设置之后,除了Home、Admin和User模块之外的模块都不能被直接访问,并且Home模块是默认访问模块(可以不出现在URL地址)。
 
以上为手册原话,然而这项配置好像没什么用?而且,所谓的直接访问指的是什么?并且在/ThinkPHP/Conf/convention.php文件里并没有找到MODULE_ALLOW_LIST这项配置。
生成模块后,直接访问http://localhost/ThinkPHP-3.2.3/home(或admin或user)均可访问。
 
八、单模块设计
将/ThinkPHP/Conf/convention.php文件里的MULTI_MODULE由true改为false,如果为false 则必须设置 DEFAULT_MODULE。
// 关闭多模块访问
'MULTI_MODULE'          =>  false,
'DEFAULT_MODULE'        =>  'Home',
一旦关闭多模块访问后,就只能访问默认模块(这里设置的是Home)。
问题:url只有为http://localhost/ThinkPHP-3.2.3/index.php时才能访问,其余形式如http://localhost/ThinkPHP-3.2.3/index.php/home或http://localhost/ThinkPHP-3.2.3/index.php/home/index/index等方式均不能访问了。
 
九、多入口设计
可以给相同的应用及模块设置多个入口,不同的入口文件可以设置不同的应用模式或者绑定模块。
例如,在index.php文件的同级目录新增一个admin.php入口文件,并绑定Admin模块:
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
原来的访问地址http://localhost/ThinkPHP-3.2.3/index.php/Admin/Index/index可以改为http://localhost/ThinkPHP-3.2.3/admin.php/Index/index。
 
同理,将index.php绑定Home模块
原来的访问地址http://localhost/ThinkPHP-3.2.3/index.php/Home/Index/index可以改为http://localhost/ThinkPHP-3.2.3/home.php/Index/index。这时出现Internal Server Error:
这是因为没有将index.php文件重命名,重命名为home.php后可以正常访问。

ThinkPHP 3.2.3(三)架构之模块化设计的更多相关文章

  1. thinkphp 模块化设计

    一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器. ThinkPHP3.2采用模块化的架构设计思想,对目录结构规范做了调整,可以支持多模块 ...

  2. thinkphp学习笔记5—模块化设计

    原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...

  3. 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    大型网站技术架构(四)--核心架构要素   作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...

  4. 总结Vue第三天:模块化和webpack模块化打包:

    总结Vue第三天:模块化和webpack模块化打包: 一.❀ 模块化 [导入import-----导出export] 1.为什么需要模块化? JavaScript 发展初期,代码简单地堆积在一起,只要 ...

  5. iOS程序模块化设计

    一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...

  6. zz《分布式服务架构 原理、设计与实战》综合

    这书以分布式微服务系统为主线,讲解了微服务架构设计.分布式一致性.性能优化等内容,并介绍了与微服务系统紧密联系的日志系统.全局调用链.容器化等. 还是一样,每一章摘抄一些自己觉得有用的内容,归纳整理, ...

  7. 深入浅出百度地图API开发系列(3):模块化设计

    在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...

  8. 认证鉴权与API权限控制在微服务架构中的设计与实现(四)

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...

  9. Django高级篇一RESTful架构及API设计

    一.什么是RESTful架构? 通过互联网通信,建立在分布式体系上"客户端/服务器模式”的互联网软件,具有高并发和高延时的特点. 简单的来说,就是用开发软件的模式开发网站.网站开发,完全可以 ...

随机推荐

  1. er

    电子锁管理 设备管理 设备管理 信息编辑;回收 电子锁发放 电子锁初始化,发放 记录车辆在发车时使用的电子锁 电子锁开锁联系人管理 电子锁开锁联系人管理 根据订单路线中的投点,设置每个投递点的开锁联系 ...

  2. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

  3. apache代理服务器为nodejs服务设置域名

    本机以apache为主,其中 在httpd.conf中先设置 <VirtualHost *:80> ServerName nodejs.cc ServerAlias www.nodejs. ...

  4. 95、Jenkins部署.net持续集成自动化测试环境

    ##目录 1. 安装Jenkins 1. 配置Jenkins 1. 自动编译 1. 自动部署 1. 自动测试 环境介绍: web服务器机器:192.168.1.7 svn服务器:192.168.1.5 ...

  5. EF常用命令行

    启用迁移:指定迁移的目录和数据库上下文名称Enable-Migrations -MigrationsDirectory "MigrationsHis" -ContextTypeNa ...

  6. 刘子健的第二次博客——有关CCCCC语言(・᷄ᵌ・᷅)

    刘子健的第二次博客--有关CCCCC语言(・᷄ᵌ・᷅) 下面又到了回答老师问题的时候啦-(・᷄ᵌ・᷅) 有些问题正在深思熟虑中!敬请期待近期的不间断更新! 你有什么技能比大多人(超过90%以上)更好? ...

  7. 浏览器请求URL原理

    访问服务器url其实是访问DNS服务器,浏览器询问DNS服务器锁访问的url的IP是什么, 找到之后就会返回结果,找不到就继续去其他DNS中寻找,找到路径之后就会返回一个html文档,浏览器会解析这个 ...

  8. TCP/IP详解学习笔记

    TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...

  9. Download Free Oracle Reports Building Guide eBook

    A very nice ebook on building reports in Oracle fusion middleware 11g. This manual is intended for a ...

  10. 连锁机构3D指纹考勤系统解决方案

    信息技术的高速发展加速了商业零售业连锁经营的信息化和全球化的进程,同时也推动了商业管理的变革.尽管人们对它的认识是被动与滞后的,但这种变革依然伴随着商业业态的转变和信息技术的发展或快或慢地在悄然进行着 ...