thinkphp 模块化设计

一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器。

ThinkPHP3.2采用模块化的架构设计思想,对目录结构规范做了调整,可以支持多模块应用的创建,让应用的扩展更加方便。

一个典型的URL访问规则是(我们以默认的PATHINFO模式为例说明,当然也可以支持普通的URL模式):

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

ThinkPHP3.2的应用可以支持切换到命令行访问,如果切换到命令行模式下面的访问规则是:

  1. >php.exe index.php(或其它应用入口文件) 模块/控制器/操作/[参数名/参数值...]

解释下其中的几个概念:

名称 描述
应用 基于同一个入口文件访问的项目我们称之为一个应用。
模块 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录。
控制器 每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。
操作 每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元。

模块化设计的思想下面模块是最重要的部分,模块其实是一个包含配置文件、函数文件和MVC文件(目录)的集合。

模块设计

新版采用模块化的设计架构,下面是一个应用目录下面的模块目录结构,每个模块可以方便的卸载和部署,并且支持公共模块。

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

注意:3.2版本在原来3.1.3的独立分组的基础上进行了改进,改进后的独立分组就是新版的模块,之前的模块则改称为控制器。 默认情况下,只要应用目录下面存在模块目录,该模块就可以访问,只有当你希望禁止某些模块或者仅允许模块访问的时候才需要进行模块列表的相关设置。

每个模块是相对独立的,其目录结构如下:

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

由于采用多层的MVC机制,除了Conf和Common目录外,每个模块下面的目录结构可以根据需要灵活设置和添加,所以并不拘泥于上面展现的目录

公共模块

Common模块是一个特殊的模块,是应用的公共模块,访问所有的模块之前都会首先加载公共模块下面的配置文件(Conf/config.php)和公共函数文件(Common/function.php)。但Common模块本身不能通过URL直接访问,公共模块的其他文件则可以被其他模块继承或者调用。

公共模块的位置可以通过COMMON_PATH常量改变,我们可以在入口文件中重新定义COMMON_PATH如下:

  1. define(‘COMMON_PATH‘,‘./Common/‘);
  2. define(‘APP_PATH‘,‘./Application/‘);
  3. require ‘./ThinkPHP/ThinkPHP.php‘;

其应用目录结构变成:

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

定义之后,Application目录下面就不再需要Common目录了。

自动生成模块目录

3.2.2版本开始,可以支持自动生成默认模块之外的模块目录以及批量生成控制器和模型类。

例如,如果我们需要生成一个Admin模块用于后台应用,在应用入口文件中定义如下:

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

然后访问URL地址

  1. http://serverName/index.php

就会生成Admin模块的目录,并生成一个默认的控制器类Admin\Controller\IndexController。 如果需要生成更多的控制器类,可以定义BUILD_CONTROLLER_LIST常量,例如:

  1. // 绑定Admin模块到当前入口文件
  2. define(‘BIND_MODULE‘,‘Admin‘);
  3. define(‘BUILD_CONTROLLER_LIST‘,‘Index,User,Menu‘);
  4. define(‘APP_PATH‘,‘./Application/‘);
  5. require ‘./ThinkPHP/ThinkPHP.php‘;

访问后会自动生成三个指定的控制器类:

  1. Admin\Controller\IndexController
  2. Admin\Controller\UserController
  3. Admin\Controller\MenuController

注意:默认生成的控制器类都是继承Think\Controller,如果需要继承其他的公共类需要另外调整。 如果在应用的公共配置文件中设置关闭了 APP_USE_NAMESPACE的话,生成的控制器类则不会采用命名空间定义。

还可以自己手动调用Think\Build类的方法来生成控制器类,例如:

  1. // 生成Admin模块的Role控制器类
  2. // 默认类库为Admin\Controller\RoleController
  3. // 如果已经存在则不会重新生成
  4. \Think\Build::buildController(‘Admin‘,‘Role‘);

同样,也可以定义BUILD_MODEL_LIST支持生成多个模型类:

  1. // 绑定Admin模块到当前入口文件
  2. define(‘BIND_MODULE‘,‘Admin‘);
  3. define(‘BUILD_CONTROLLER_LIST‘,‘Index,User,Menu‘);
  4. define(‘BUILD_MODEL_LIST‘,‘User,Menu‘);
  5. define(‘APP_PATH‘,‘./Application/‘);
  6. require ‘./ThinkPHP/ThinkPHP.php‘;

访问会自动生成模型类:

  1. Admin\Model\UserModel
  2. Admin\Model\MenuModel

注意:默认生成的模型类都是继承Think\Model,如果需要继承公共的模型类需要另外调整。 如果在应用的公共配置文件中设置关闭了 APP_USE_NAMESPACE的话,生成的模型类则不会采用命名空间定义。

也可以自己手动调用Think\Build类的方法来生成模型类,例如:

  1. // 生成Admin模块的Role模型类
  2. // 默认类库为Admin\Model\RoleModel
  3. // 如果已经存在则不会重新生成
  4. \Think\Build::buildModel(‘Admin‘,‘Role‘);

禁止访问模块

3.2对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,但可以配置禁止访问的模块列表(用于被其他模块调用或者不开放访问),默认配置中是禁止访问Common模块和Runtime模块(Runtime目录是默认的运行时目录),我们可以增加其他的禁止访问模块列表:

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

设置后,Api模块不能通过URL直接访问,事实上,可能我们只是在该模块下面放置一些公共的接口文件,因此都是内部调用即可。

设置访问列表

如果你的应用下面模块比较少,还可以设置允许访问列表和默认模块,这样可以简化默认模块的URL访问。

  1. ‘MODULE_ALLOW_LIST‘ => array(‘Home‘,‘Admin‘,‘User‘),
  2. ‘DEFAULT_MODULE‘ => ‘Home‘,

设置之后,除了Home、Admin和User模块之外的模块都不能被直接访问,并且Home模块是默认访问模块(可以不出现在URL地址)。

单模块设计

如果你的应用够简单,那么也许仅仅用一个模块就可以完成,那么可以直接设置:

  1. // 关闭多模块访问
  2. ‘MULTI_MODULE‘ => false,
  3. ‘DEFAULT_MODULE‘ => ‘Home‘,

一旦关闭多模块访问后,就只能访问默认模块(这里设置的是Home)。

单模块设计后公共模块依然有效

多入口设计

可以给相同的应用及模块设置多个入口,不同的入口文件可以设置不同的应用模式或者绑定模块。

例如,我们在index.php文件的同级目录新增一个home.php入口文件,并绑定Home模块:

3.2.0版本写法:

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

3.2.1以上版本写法:

  1. // 绑定Home模块到当前入口文件
  2. define(‘BIND_MODULE‘,‘Home‘);
  3. define(‘APP_PATH‘,‘./Application/‘);
  4. require ‘./ThinkPHP/ThinkPHP.php‘;

如果你更改了系统默认的变量设置,则需要做对应的模块绑定的变量调整。

绑定模块后,原来的访问地址

  1. http://serverName/index.php/Home/Index/index

就变成

  1. http://serverName/home.php/Index/index

同样的方式,我们也可以在入口文件中绑定控制器,例如:

3.2.0版本写法:

  1. $_GET[‘m‘] = ‘Home‘; // 绑定Home模块到当前入口文件
  2. $_GET[‘c‘] = ‘Index‘; // 绑定Index控制器到当前入口文件
  3. define(‘APP_PATH‘,‘./Application/‘);
  4. require ‘./ThinkPHP/ThinkPHP.php‘;

3.2.1以上版本写法:

  1. define(‘BIND_MODULE‘, ‘Home‘); // 绑定Home模块到当前入口文件
  2. define(‘BIND_CONTROLLER‘,‘Index‘); // 绑定Index控制器到当前入口文件
  3. define(‘APP_PATH‘,‘./Application/‘);
  4. require ‘./ThinkPHP/ThinkPHP.php‘;

绑定模块和控制器后,原来的访问地址:

  1. http://serverName/index.php/Home/Index/index

就变成:

  1. http://serverName/home.php/index

不同的入口文件还可以用于绑定不同的应用模式,参考应用模式部分。

原文地址:https://www.cnblogs.com/furuihua/p/11757953.html

时间: 2024-11-05 17:25:57

thinkphp 模块化设计的相关文章

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

1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...] 应用:由同一个入口文件访问的项目称为一个应用,在完整版的代码中就是Application 模块:一个应用下面可以包含多个模块,每个模块对应独立的目录,在完整版的代码中有Admin,Home,Common,Runtime四个模块

ThinkPHP学习笔记(五)模块化设计

1.模块化设计 一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器. 一个典型的URL访问规则是(我们以默认的PATHINFO模式为例说明,当然也可以支持普通的URL模式):    http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...] ThinkPHP3.2的应用可以支持切换到命令行访问,如果切换到命令行模式下面的访问规则是:    >php.exe index.p

【Nginx】模块化设计

高度模块化的设计是Nginx的架构基础.所有模块都是以ngx_module_t结构体表示,该结构体内部定义了7个回调方法,它们负责模块的初始化和退出.commands成员是一个包含有ngx_command_t结构体的数组,ngx_command_t的作用就是解析配置项.ctx是一个void指针,这使得模块具有高度灵活性. ctx可以指向不同类型模块的通用接口,官方Nginx共有5大类模块,与ctx接口的对应关系如下: 核心模块:接口为ngx_core_module_t,类型宏为NGX_CORE_

ThinkPHP框架设计与扩展总结

详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一些简单的开发示例中来深入了解一下这个框架给我们带来的开发便捷性,以及游刃有余的扩展设计.同时也从源码分析的角度看看框架的一些不足,尽量做全面客观的评价.这里假设大家已经使用过ThinkPHP框架,基本使用方法请参考官方文档. 一.框架分层及url路由 框架的安装非常简单,下载后放入web服务器的目录即可,但

模块化设计思考

模块主要包括:            1.接口                    1-1.OO中,接口通常是一个层次结构                        1-2.接口表示一种抽象的数据类型                    2.实现                        2-1.接口的具体实现                        2-2.可重用的数据结构                    3.算法                    3-1.在一个实

iOS程序模块化设计

一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和组合构成不同的定制产品,以满足市场的不同需求. 模块化设计是绿色设计方法之一,绿色设计是指“在产品整个生命周期内,着重考虑产品环境属性(可拆卸性.可回收性.可维护性.可重复利用性等)并将其作为设计目标,在满足环境目标要求的同时,保证产品应该有的功能.使用寿命.质量等要求”. 绿色设计的原则被公认为“

AngularJs学习笔记7——四大特性之模块化设计

模块化设计 1.引用自定义模块并调用 自定义模块中,如果有一些服务.封装好笑模块,在另外一个模块中(声明的时候,在依赖列表中加入要引入的模块) var app02 = angular.module('fan02',['ng','fan']); 就调用fan02模块中所定义的东西 2.ng内置的模块的用法 (1) ngRoute模块(路由模块) AngularJS是一个开源的js框架.用在数据操作比较频繁的场景下,用于SPA应用 单页面应用的工作原理: 1.页面url:http://127.0.0

Swift之xib模块化设计

一.解决问题 Xib/Storybarod可以方便.可视化的设置约束,在开发中也越来越重要.由于Xib不能组件化,使得封装.重用都变得不可行.本文将介绍一种解决方案,来实现Xib组件化. 二.模型块原理 在介绍原理之前,我们先弄清楚两个概念: 从上图可以看出,分别选中File's Owner及根视图View,都有Custom Class属性面板.其中Class属性,有什么作用,区别又是什么呢? 2.1 View的Class属性 View的Class属性用于指定选中的视图的实例化类.Xib实际上是

动画中的模块化设计

1.动画效果实现难度的判断 2.将看到的动画效果拆分成小模块 3.将写好的小模块组合成你所需要的动画效果 一,新建一个BaseAnimationView主控类 @interface BaseAnimationView : UIView - (void)show; - (void)hide; - (void)buildView; @end #import "BaseAnimationView.h" #import "CircleView.h" #import &quo