原文:thinkphp学习笔记5—模块化设计

1.模块结构  

  完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制。ThinkPHP默认PATHINFO模式,如下:

http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]

应用:由同一个入口文件访问的项目称为一个应用,在完整版的代码中就是Application

模块:一个应用下面可以包含多个模块,每个模块对应独立的目录,在完整版的代码中有Admin,Home,Common,Runtime四个模块

控制器:每个模块下有多个控制器,放在Controller目录里面,控制器对应一个单独的php类文件

操作:在控制器中又可以包含多个操作方法,还可以邦东某个操作类,每个操作就是URL访问的最小单元,这个有点迷惑,类不是方法,可以有返回值么?

2.模块设计

模块的目录结构如下:

  1. Application 默认应用目录(可以设置)
  2. ├─Common 公共模块(不能直接访问)
  3. ├─Home 前台模块
  4. ├─Admin 后台模块
  5. ├─... 其他更多模块
  6. ├─Runtime 默认运行时目录(可以设置)

模块不是固定的,可以方便的删除添加,但是一般Common,Runtime两个不用删除。

在模块内部又可以包含配置,控制器,模型等目录,结构如下:

  1. ├─Module 模块目录
  2. │ ├─Conf 配置文件目录
  3. │ ├─Common 公共函数目录
  4. │ ├─Controller 控制器目录
  5. │ ├─Model 模型目录
  6. │ ├─Logic 逻辑目录(可选)
  7. │ ├─Service Service目录(可选)
  8. │ ... 更多分层目录可选
  9. │ └─View 视图目录

除了Common和Conf目录之外,其他的可以灵活的添加和删除。

Common模块是一个公共模块,访问所有模块之前都会首先加载这个公共模块下的配置文件Conf/config.php和公共函数文件Common/function.php,但是没有找到这个function.php文件,Common模块本身不能通过URL直接访问,公共模块中的其他文件可以被其他模块集成或者调用。此外公共模块的位置可以通过COMMON_PATH常量改变,在入口文件中重新定义COMMON_PATH如下:

define('COMMON_PATH','./Common/');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

目录结构变化如下

  1. www WEB部署目录(或者子目录)
  2. ├─index.php 入口文件
  3. ├─README.md README文件
  4. ├─Common 应用公共模块目录
  5. ├─Application 应用模块目录
  6. ├─Public 应用资源文件目录
  7. └─ThinkPHP 框架目录

我这里不是用define('COMMON_PATH','./Common/');生成的,而是define('COMMON_PATH','Common/');去掉了前面的./,生成目录截图如下:

这样Application目录下的Common目录就没有作用了。

3.自动生成模块目录

3.2.2版本开始可以自动生成默认模块和自动生成控制器和模型,例如现在要生成一个Admin模块用于网站后台管理,可以在入口文件下面添加下面代码

// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

然后刷新就可以在Application目录下面生成一个Admin目录,并且在Controller目录里面生成一个默认的控制器IndexController.Class.php文件,手册中的注释是绑定Admin模块到当前入口文件,其实这句话的具体作用是:如果没有应用下面没有Admin这个模块那么自动生成这个模块并以此模块作为入口文件,注意如果绑定的是Home这个模块,而去访问Admin这个目录就会报错的,http://Servername/thinkphp/index.php/Admin/Index,错误内容是:

无法加载控制器:Admin

还有一点,如果生成模块之后我们删除这句绑定,就没有错了,这样可以随便访问任何模块。

生成模块之后我们还可以自动在模块内生成控制器和模型文件,代码如下:

define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');

注意这两句要一起执行,我测试发现如果开始执行第一句生成模块,再加上后面一句生成控制器的时候是不成功的,要删掉这个Admin目录,然后执行,这样会生成目录然后再Controller目录下生成控制器文件,这个有点傻瓜。

生成的控制器是继承自Think\Controller下。也可以实用命令行来生成控制器,这里我在赘述。

同样的道理也可以自动生成模型,代码如下:

define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('BUILD_MODEL_LIST','User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

同样的,不能有先后顺序,就是说这三句必须一起执行才有效,不能逐一执行。控制器继承自Think\Model

据我观察,如果没有绑定模块是会自动生成Home模块并访问这个模块的

系统默认配置中是禁止访问Common模块和Runtime模块,我们也可自己添加禁止访问的模块,代码如下:

// 设置禁止访问的模块列表
'MODULE_DENY_LIST' => array('Common','Runtime','Api'),

同样也可设置可以访问的模块和默认模块,代码如下:

'MODULE_ALLOW_LIST'    =>    array('Home','Admin','User'),
'DEFAULT_MODULE' => 'Home',

据我观察,就算不设置默认模块,ThinkPHP也会默认生成并访问Home模块。

如果项目比较简单,还可以设置单模块,代码如下:

// 关闭多模块访问
'MULTI_MODULE' => false,
'DEFAULT_MODULE' => 'Home',

可以给相同的用用及模块绑定多个入口,不同入口文件设置不同的应用模式和绑定模块,代码如下:

// 绑定Home模块到当前入口文件
$_GET['m'] = 'Home';
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

这样就可以使用下面的路径来访问了http://Servername/thinkphp/home.php/Index

这个home.php里的内容和index.php内容一样,也是一个入口文件。

thinkphp学习笔记5—模块化设计的更多相关文章

  1. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  2. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  3. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  4. thinkphp学习笔记8—命名空间

    原文:thinkphp学习笔记8-命名空间 新版本(3.2)中采用命名空间的方式定义和加载类库文件,解决多个模块之间的冲突问题,并实现了更加高效的自动加载机制. 需要给类库定义所在的命名空间,命名空间 ...

  5. thinkphp学习笔记6—url模式

    原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...

  6. thinkphp学习笔记4—眼花缭乱的配置

    原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...

  7. thinkphp学习笔记3—项目编译和调试模式

    原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并 ...

  8. thinkphp学习笔记2—入口文件

    原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...

  9. thinkphp学习笔记1—目录结构和命名规则

    原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...

随机推荐

  1. windows下使用lighttpd+php(fastcgi)+mysql

    一.windows下编译配置执行lighttpd 1.下载并安装cygwin. 2.下载lighttpd源码并解压3.在cygwin环境下进入lighttpd的解压文件夹后,执行: 1> ./c ...

  2. 每天努力一点之SQL

    今天工作当中遇到一个问题:统计信息并导出EXcel 报表. 刚开始只做了统计信息: 如下图 请看最后一列的数据. 我当时想都从数据库里取出来,但是由于我能力有限没有做出来.先贴下后来写的SQL 语句. ...

  3. Oracle 工艺结构

    Oracle工艺结构 这个过程是动态创建,完毕任务后就消亡:而程序是静态的实体,程序是能够复制.编辑的.进程强调的是运行过程,而程序不过指令的有序集合:进程在内存中,程序在外存中. ORACLE分为用 ...

  4. NYOJ 300 && hdu 2276 Kiki & Little Kiki 2 (矩阵高速功率)

    pid=300">Kiki & Little Kiki 2 时间限制:5000 ms  |  内存限制:65535 KB 难度:4 描写叙述 There are n light ...

  5. Android - 分享内容 - 接收其他APP的内容

    就象程序可以发送数据给其他程序,所以也可以接收其他程序的数据.想一下用户如何和程序交互,以及想从其他程序接收什么样类型的数据.例如,一个社交程序可能对接收其他程序的文字(比如有趣的网址)感兴趣.Goo ...

  6. Oracle 六闪回技术,flashback

    Flashback 技术基于Undo segment基于内容的, 因此,限制UNDO_RETENTON参数. 要使用flashback 特征,您必须启用自己主动撤销管理表空间. 在Oracle 11g ...

  7. Linux课程_系统配置和日常维护

    1.设置命令输入提示格公式:"username:当前文件夹$" 2.设置命令输入提示行格式为:"当前系统时间-用户#"(提示:Shell将通过反引號" ...

  8. 将cocos2dx+lua创建的游戏port到windows phone

    在整个Port的过程中遇到的问题总结例如以下 1.一定要使用最新版本号的cocos2dx,原因大家看一下changelog就知道了,近期的cocos2dx版本号都是在修windows phone上的b ...

  9. 无需Visual Studio,5容易的 - 分为报告

    总报告设计,例如RDLC.水晶报表等.,需要安装Visual Studio.由VS提供报表设计界面设计报告,由VS设计报告.NET非常方便开发者,.但对于非开发,安装4G一个VS.并且需要Licens ...

  10. War文件部署(转)

    其实,开始要求将源码压缩成War文件时,一头雾水! 公司项目要求做CAS SSO单点登录 也就是这玩意.... 其实war文件就是Java中web应用程序的打包.借用一个老兄的话,“当你一个web应用 ...