一、概念
应用:基于同一个入口文件访问的项目称之为一个应用。
模块:一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录,是一个包含配置文件、函数文件和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. js定义对象的几种容易犯的错误

    //js定义对象的几种容易犯的错误function Person() { getName = function (){ console.info(1); }; return this;}//Perso ...

  2. fiddler如何修改request header

    在命令行中输入命令:  bpu www.baidu.com   (这种方法只会中断www.baidu.com) 然后刷新网站,在fiddler中点击被打断的网址,点击Inspectors—>Ra ...

  3. java cef3 禁止右键菜单项

    如下图所示,在context_menu_handler.cpp中ContextMenuHandler::OnBeforeContextMenu添加以下代码即可: ){ model->Clear( ...

  4. WebForm Application Viewstate 以及分页(功能性的知识点)

    Application: 全局公共变量组 存放位置:服务器 特点:所有访问用户都是访问同一个变量,但只要服务器不停机,变量一直存在于服务器的内存中,不要使用循环大量的创建Application对象,可 ...

  5. 遗传算法在JobShop中的应用研究(part 7:整体流程)

    """ pop是种群,种群中的每个个体的形式是,(makespan, 染色体)""" pop = [(ComputeStartTimes(g ...

  6. [OC] Podfile 格式内容

    platform :ios, '8.0' target :'targetName' do pod 'Masonry', '~> 1.0.1' pod 'SDCycleScrollView', ' ...

  7. Snipaste

    http://files.cnblogs.com/files/hwd13/Snipast.zip

  8. k近邻

    k近邻(k-NearestNeighbor)算法简称kNN.基本思想简单直接,对于一个需要分类的数据实例x,计算x与所有已知类别的样本点在特征空间中的距离.取与x距离最近的k个样本点,统计这些样本点所 ...

  9. WebUpLoder 能自动预览,能多实例,包括后台demo

    样式在网上找的.样子: 懒得写别的了,代码里面我写的注释挺详细的:https://github.com/zhangsai521314/WebUpLoder 写文不易,转载请注明出处:http://ww ...

  10. Bootstrap之Carousel不能自动播放的解决办法(转)

    Bootstrap是一个非常好的css/javaScript框架,尤其对于移动端的自适应和适配能力都比较强. 用Bootstrap自带的Carousel写了一个图片轮播的广告部分,用js调用后却出现了 ...