多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 模块设计 > 5\.1版本默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以`app`作为根命名空间(可通过环境变量更改)。 ## 目录结构 标准的应用和模块目录结构如下: ``` ├─application 应用目录(可设置) │ ├─common 公共模块目录(可选) │ ├─module1 模块1目录 │ │ ├─common.php 模块函数文件 │ │ ├─config 模块配置目录(可选) │ │ ├─controller 控制器目录 │ │ ├─model 模型目录(可选) │ │ ├─view 视图目录(可选) │ │ └─ ... 更多类库目录 │ │ │ ├─module2 模块2目录 │ │ ├─common.php 模块函数文件 │ │ ├─config 模块配置目录(可选) │ │ ├─controller 控制器目录 │ │ ├─model 模型目录(可选) │ │ ├─view 视图目录(可选) │ │ └─ ... 更多类库目录 ``` > 模块的配置目录也可以放到外面的config目录的模块子目录下面。 遵循ThinkPHP`5.1`的命名规范,模块目录全部采用**小写和下划线**命名。 > 模块名称请避免使用PHP保留关键字(保留字列表参见 <http://php.net/manual/zh/reserved.keywords.php> ),否则会造成系统错误。 其中`common`模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承。 ## 模块类库 一个模块下面的类库文件的命名空间统一以`app\模块名`开头,例如: ``` // index模块的Index控制器类 app\index\controller\Index // index模块的User模型类 app\index\model\User ``` ## 模块和控制器隐藏 由于默认是采用多模块的支持,所以多个模块的情况下必须在URL地址中标识当前模块,如果只有一个模块的话,可以在入口文件中进行模块绑定: ``` <?php // [ 应用入口文件 ] namespace think; // 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; // 执行应用并响应(绑定当前访问到index模块) Container::get('app')->bind('index')->run()->send(); ``` 绑定后,我们的URL访问地址则变成: > #### [http://serverName/index.php/控制器/操作/\[参数名/参数值...\]](http://serverName/index.php/%E6%8E%A7%E5%88%B6%E5%99%A8/%E6%93%8D%E4%BD%9C/%5B%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC...%5D) 访问的模块是`index`模块。 如果你的应用比较简单,模块和控制器都只有一个,那么可以在应用公共文件中绑定模块和控制器,如下: ``` // 绑定当前访问到index模块的index控制器 Container::get('app')->bind('index/index')->run()->send(); ``` 设置后,我们的URL访问地址则变成: > #### [http://serverName/index.php/操作/\[参数名/参数值...\]](http://serverName/index.php/%E6%93%8D%E4%BD%9C/%5B%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC...%5D) 访问的模块是`index`模块,控制器是`Index`控制器。 ## 单一模块 如果你的应用比较简单,只有唯一一个模块,那么可以进一步简化成使用单一模块结构,方法如下: 首先在应用配置文件中定义: ``` // 关闭多模块设计 'app_multi_module' => false, ``` 然后,调整应用目录的结构为如下: ``` ├─application 应用目录(可设置) │ ├─controller 控制器目录 │ ├─model 模型目录 │ ├─view 视图目录 │ ├─ ... 更多类库目录 │ └─common.php 函数文件 ``` URL访问地址变成 > #### [http://serverName/index.php(或者其它应用入口)/控制器/操作/\[参数名/参数值...\]](http://serverName/index.php%EF%BC%88%E6%88%96%E8%80%85%E5%85%B6%E5%AE%83%E5%BA%94%E7%94%A8%E5%85%A5%E5%8F%A3%EF%BC%89/%E6%8E%A7%E5%88%B6%E5%99%A8/%E6%93%8D%E4%BD%9C/%5B%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC...%5D) 同时,单一模块设计下的应用类库的命名空间也有所调整,例如: 原来的 ``` app\index\controller\Index app\index\model\User ``` 变成 ``` app\controller\Index app\model\User ``` 更多的URL简化和定制还可以通过URL路由功能实现。 > 单一模块方式仍然可以通过多级控制器的方式来管理控制器层次 ## 空模块 可以把不存在的模块访问统一指向一个空模块,设置: ``` // 设置空模块名为home 'empty_module' => 'home', ``` 如果访问了一个不存在的模块,系统会指向home模块进行访问。 > 空模块只有开启多模块访问,并且没有绑定模块的情况下才有效。 ## 环境变量 5\.1版本取消了所有的系统常量,原来的系统路径变量改为使用`Env`类获取(需要引入`think\facade\Env`): 例如: ``` // 获取应用目录(不区分大小写) echo Env::get('app_path'); // 或者 echo Env::get('APP_PATH'); ``` 支持获取的系统路径变量包括: 系统路径Env参数名称应用根目录root\_path应用目录app\_path框架目录think\_path配置目录config\_path扩展目录extend\_pathcomposer目录vendor\_path运行缓存目录runtime\_path路由目录route\_path当前模块目录module\_path