thinkPhp 框架学习——架构

本文详细介绍了ThinkPHP框架的架构,包括URL模式、模型层、视图层、控制器层、驱动、行为等方面,强调了URL大小写敏感性和不同模式的URL访问规则。通过设置不同模式,可以简化URL地址并实现多层模型和控制器。此外,还讲解了模型、视图、控制器的分层设计,以及行为的定义和绑定,展示了如何通过行为扩展增强框架功能。
摘要由CSDN通过智能技术生成
1)、模块化设计

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

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

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

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

解释下其中的几个概念:

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

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

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

 
 
  1. define('COMMON_PATH','./Common/');
定义之后,Application目录下面就不再需要Common目录了。
自动生成模块目录

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

 
 
  1. // 绑定Admin模块到当前入口文件
  2. define('BIND_MODULE','Admin');

然后访问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');

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

 
 
  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');
禁止访问模块
默认配置中是禁止访问 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)。

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

3.2.0版本写法:

 
 
  1. // 绑定Home模块到当前入口文件
  2. $_GET['m'] = 'Home'; 

3.2.1以上版本写法:

 
 
  1. // 绑定Home模块到当前入口文件
  2. define('BIND_MODULE','Home');
如果你更改了系统默认的变量设置,则需要做对应的模块绑定的变量调整。

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

 
 
  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.2.1以上版本写法:

 
 
  1. define('BIND_MODULE', 'Home'); // 绑定Home模块到当前入口文件
  2. define('BIND_CONTROLLER','Index'); // 绑定Index控制器到当前入口文件

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

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

就变成:

 
 
  1. http://serverName/home.php/index
不同的入口文件还可以用于绑定不同的应用模式,参考 应用模式 部分。

2)、URL模式

入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作:

 
 
  1. http://serverName/index.php/模块/控制器/操作

这是3.2版本的标准URL格式。

可以通过设置模块绑定或者域名部署等方式简化URL地址中的模块及控制器名称。

URL大小写

ThinkPHP框架的URL是区分大小写(主要是针对模块、控制器和操作名,不包括应用参数)的,这一点非常关键,因为ThinkPHP的命名规范是采用驼峰法(首字母大写)的规则,而URL中的模块和控制器都是对应的文件,因此在Linux环境下面必然存在区分大小写的问题。

框架内置了一个配置参数用于解决URL大小写的问题,如下:

 
 
  1. 'URL_CASE_INSENSITIVE' => true,

URL_CASE_INSENSITIVE设置为true的时候表示URL地址不区分大小写,这个也是框架在部署模式下面的默认设置。

当开启调试模式的情况下,这个参数是false,因此你会发现在调试模式下面URL区分大小写的情况。

URL模式

如果我们直接访问入口文件的话,由于URL中没有模块、控制器和操作,因此系统会访问默认模块(Home)下面的默认控制器(Index)的默认操作(index),因此下面的访问是等效的:

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

这种URL模式就是系统默认的PATHINFO模式,不同的URL模式获取模块和操作的方法不同,ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式,可以设置URL_MODEL参数改变URL模式。

URL模式 URL_MODEL设置
普通模式 0
PATHINFO模式 1
REWRITE模式 2
兼容模式 3
如果你整个应用下面的模块都是采用统一的URL模式,就可以在应用配置文件中设置URL模式,如果不同的模块需要设置不同的URL模式,则可以在模块配置文件中设置。

普通模式

普通模式也就是传统的GET传参方式来指定当前访问的模块和操作,例如:http://localhost/?m=home&c=user&a=login&var=value

m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参数。

如果默认的变量设置和你的应用变量有冲突的话,你需要重新设置系统配置,例如改成下面的:

 
 
  1. 'VAR_MODULE' => 'module', // 默认模块获取变量
  2. 'VAR_CONTROLLER' &#
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值