ThinkPHP配置:MULTI_MODULE BIND_MODULE DEFAULT_MODULE

以下范例皆以不隐藏入口文件 index.php 为例

ThinkPHP 3.2 版本后将整个项目 Application 作为一个应用,应用下可以存在多个模块,访问规则对应为

domain/index.php/Module/Controller/Action

框架与之相关的几个参数为

配置参数:

                MUTI_MODULE    是否开始多模块访问,默认开启

                DEFAULT_MODULE    设定默认模块,默认为Home

常量参数:

                BIND_MODULE    将当前入口脚本绑定到某模块


这里需要注意的是

DEFAULT_MODULE    默认值为 Home

DEFAULT_CONTROLLER 默认值为 Index

DEFAULT_ACTION 默认值为 index

当我们在默认情况下访问 domain.com/index.php 时系统会根据默认值加载 Home/Index/index

1、默认 MUTI_MODULE => true,即多模块支持, 我们可以使用  domain/index.php/Module/Controller/Action 进行模块功能的访问,且此处不可省略 Module,即系统会将 index.php 后的第一个参数作为模块名,第二个为控制器名,第三个为操作名,若某项不存在则使用默认值

2、若 MUTI_MODULE => false,即关闭多模块支持,即当前入口文件只对应一个模块,则系统会根据 DEFAULT_MODULE 的值去设定默认模块(注意如果没有手动配置 TP 会使用 Home 作为默认模块,我们可以在 Common 模块的配置文件中自行定义自己想要的默认模块 ),且 url 中不允许出现 Module,即必须以 domain/index.php/Controller/Action 的格式访问。很好理解,关闭多模块则系统会根据默认模块的设定路由,这里的 index.php 其实已经相当于 index.php/defaultModel 了,同时此时是无法访问其他模块的,因为 url 格式已经被规格为  index.php/Controller/Action 了,你输入只能是默认模块下的 控制器 和 操作 的 id

3、若在入口文件中定义了 define('BIND_MODULE', 'Web'),则等同于  MUTI_MODULE => false, DEFAULT_MODULE => 'Web' 的设定,即关闭多模块,同时为此入口文件绑定 Web 模块,此时的 url 中也不允许传入模块名:index.php/Controller/Action


处理流程:

系统会优先检测当前入口脚本所生成的应用实体中是否定义了 BIND_MODULE,若定义,则路由时就已经内部选定了模块为 BIND_MODULE,所以你不需要也不能再 url 中输入模块名,因为 index.php 后紧跟的已经被规则为 Controller/Action,你输入模块会被当作控制器处理。

如果没有定义 BIND_MODULE,则检测是否开启了 MULTI_MODULE。如果开启了,则你必须在 index.php 后面输入 Module/Controller/Action 的格式,因为只有这样系统才能准确的判定在多模块中你想要访问哪个模块;如果关闭了 MULTI_MODULE,则说明此入口脚本只对应一个模块,系统需要确定这个模块,则系统会使用 DEFAULT_MODULE 的值去设定,DEFAULT_MODULE 默认值为 Home,但我们可以自定义。

所以说 

define('BIND_MODULE', 'Web') == (MULTI_MODULE => true && DEFAULT_MODULE => 'Web')

例如:

默认下开启多模块,默认控制器为 Home,必须通过指定模块名/控制器名/方法名的方式去定向访问

ThinkPHP配置:MULTI_MODULE BIND_MODULE DEFAULT_MODULE_第1张图片

如果我跳过模块,则系统会把我本意为控制器作为模块处理

ThinkPHP配置:MULTI_MODULE BIND_MODULE DEFAULT_MODULE_第2张图片

关闭多模块,则此时系统需选定一个模块作为默认模块,此时选取 DEFAULT_MODULE 的值作为默认模块,此时不需要也不允许在地址中输入模块名

<?php
return array(
    //'配置项'=>'配置值'
   'MULTI_MODULE' => false,
   'DEFAULT_MODULE' => 'Web'
);

ThinkPHP配置:MULTI_MODULE BIND_MODULE DEFAULT_MODULE_第3张图片

入口脚本处绑定模块则模块已被设定,url中不允许出现Module,index.php后的参数会被作为 控制器和操作去处理

ThinkPHP配置:MULTI_MODULE BIND_MODULE DEFAULT_MODULE_第4张图片

总结:

thinkphp支持多模块,同时默认开启多模块支持,所以此时必须在 url 中明确的输入 index.php/moduleID/controllerID/actionID才可以正确的访问当前某模块,若关闭多模块支持则系统会使用默认的模块作为预定义模块,url 以 index.php/controllerID/actionID 来正确的访问,如当前脚本绑定模块,则 url 中同时不允许出现 moduleID


你可能感兴趣的:(BIND_MODULE,DEFAULT_MODULE,MULTI_MODULE)