### 2018 年 12 月 5 日 发布
## 引言
ThinkPHP`5.2`发布测试版本以来,越来越多的的用户开始关注(让人惊奇的是居然有用户已经开始用于项目,实在是勇气可嘉^_^),并希望能有官方手册,但很遗憾的是,在正式版本尚未发布之前,官方暂时不会出开发手册。主要原因是正式发布之前,仍然有变化的可能,手册存在不确定因素,也不希望误导大家引起误会,另外一方面,确实是因为忙(带娃模式),最近连《[笨办法学ThinkPHP5.1](https://www.kancloud.cn/thinkphp/thinkphp-the-hard-way)》还一直搁浅着呢,实在是抱歉。
不过,也说过会写一些简单的教程先,让那些热衷于测试新版本的用户有机会学习和体验。因此,现在开始我会陆续更新一些`5.2`的使用教程,主要是讲述一些区别之处,避免雷区。
希望通过本系列教程抛砖引玉,开启`5.2`的学习之门,不排除可能由于后续版本的调整而产生变化,有兴趣的开发者可以参与新版文档教程的写作贡献,官方会择优收录到[ThinkPHP开发者周刊](https://www.kancloud.cn/thinkphp/weekly/content)中。
>[danger] 再次强调,`5.2`版本目前属于测试版本,存在不稳定性,请勿轻易用于正式项目。
## 安装
由于`5.2`版本完全依赖`Composer`,因此只能通过`composer`安装才能使用,不同于`5.0`和`5.1`版本,下载或者`Git`安装都可以使用。
由于只是测试阶段,所以必须安装`dev`版本
```
composer create-project topthink/think tp520 5.2.*-dev
```
启动服务
```
cd tp520
php think run
```
## 入口文件
新版的入口文件还是位于`public`目录下面,由于直接使用`composer`的自动加载机制,因此框架核心已经不再使用`Loader`类了而是改为加载`composer`的`autoload`文件。
秉承`ThinkPHP`大道至简的原则,入口文件依然非常之简单:
```
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 执行应用并响应
(new App())->run()->send();
```
注意每一个入口文件在新版里面总是对应一个应用,有意思的是,不同的应用入口文件除了文件名不同外代码可能完全一样(会自动绑定到文件名对应的应用)。
如果你的文件名和应用名不一致,那么可能需要略微调整如下:
```
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 执行应用并响应
(new App())->name('app_name')
->run()
->send();
```
`think\App`类还提供了很多的设置方法,都可以在`run`之前调用。这个有兴趣深入了解的可以通过源码查看。
由于新版本一个入口文件对应一个应用,如果你希望保持`5.1`版本的URL形式不变,直接访问不同的应用,一个最简单的办法就是设置`Apache`的`.htaccess`文件。
```
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]+)/(.*)$ $1.php/$2 [QSA,PT,L]
</IfModule>
```
其它的WEB服务器环境可以参考修改。
## 应用目录及命名空间调整
新版的目录结构其实看起来和`5.1`并无多大的差异,除了`thinkphp`框架目录已经纳入`vendor`之外。另外应用目录从原来的`application`更改为`app`,之所以做这个调整是为了让新手更容易理解应用的命名空间对应,不至于产生不必要的困惑。
但其实有一个本质的改变就是新版不再支持多模块,而改为原生多应用支持。因此你原来的模块目录可能在新版就变成了应用目录,为了让升级工作更简单,新版的应用命名空间和多模块保持一致。
应用命名空间类似于
```
\app\admin\controller
\app\admin\model
```
如果你需要更改根命名空间为`top`,有两种办法。一种是修改`composer.json`文件的`autoload`,这样可以不改变目录名。
```
"psr-4": {
"top\\": "app"
},
```
第二种办法是直接修改你的`app`目录为`top`。
无论使用哪一种方法,最后在入口文件中设置根命名空间名称。
```
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 执行应用并响应
(new App())->setRootNamespace('top')
->run()
->send();
```
如果你的`admin`应用不在`app`目录下面,有完全独立的命名空间例如
```
\think\admin
```
就可以在入口文件`admin.php`中进行指定
```
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 设置当前应用的命名空间
(new App())->setNamespace('\think\admin')
->run()
->send();
```
这个应用放在什么位置取决于你的命名空间自动加载路径,这一设计让你的应用可以通过`composer`来加载。
## 多应用模式
多应用模式下面,除了应用目录的区别外,`runtime`目录下面会自动创建各个应用的子目录(注意,这个目录同样适用于`composer`加载的应用),但你只需要通过`App::getRuntimePath()`方法获取当前应用的`runtime`目录。
```
runtime/home/
runtime/admin/
```
多个应用的路由定义文件都是独立的,在`route`目录下面创建对应目录的子目录存放每个应用的路由定义。
```
route/home/
route/admin/
```
多个应用允许加载统一的公共文件。
```
app/common.php
app/admin/common.php
app/home/common.php
```
对于配置文件而言,`config`目录下为应用公共配置,`config`下子目录则为单个应用的独立配置。
```
config/
config/admin/
config/home/
```
可能有人认为现在不同的应用是独立的入口文件,每个应用之间没法互通了,其实这个理解是错误的。不同的应用仍然是可以相互调用的,毕竟类库都是基于命名空间的。
## 单应用模式
上面的目录结构其实是多应用设计,和之前版本一样同样支持单应用模式(之前版本其实是单一模块模式)如果你使用的是单应用的话,目录结构其实就变成了下面的结构。
```
www
├─app 应用目录
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─view 视图目录
│ └─ ... 更多类库目录
```
系统的一个默认判断单应用的规则是`app`目录下面如果存在`controller`目录,则判断当前为单应用模式。如果你更改了默认的访问控制器层的名称(或者刚好有一个应用名称也叫`controller`),那么可以在入口文件里面调用 `multi(false)`来设置为单应用模式。
```
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 执行应用并响应
(new App())->multi(false)
->run()
->send();
```
单应用模式下,如果需要更改命名空间,`setNamespace`和`setRootNamespace`方法是等效的。
## 小结
本篇我们基本了解了`5.2`的目录结构和入口文件的用法,并掌握了多应用模式和单应用模式的区别及使用。下一篇,我会给大家讲下数据库和模型和之前版本的区别。
- 值得升级到5.1的18个理由
- 5.1.7版本新特性
- JSON字段类型在ORM中的使用
- 文件下载响应对象
- 教你使用5.1的数组对象查询
- 模型三大利器之一:搜索器
- 在ThinkPHP中使用Yaconf
- 掌握命令行的表格输出
- 5.1.25查询参数绑定的改进
- ThinkPHP安全规范指引
- 巧用数据集的排序功能实现统计排序
- think-orm ——基于5.1的独立ORM库
- think-template——基于ThinkPHP的独立模板引擎
- ThinkPHP5.1.26版本发布——修正版本,包含安全更新
- ThinkPHP5.0和3.2再发安全更新
- 官宣:ThinkPHP发布首个LTS版本
- 你真的了解Db类和模型的正确使用姿势么?
- 如何更有效的记录和管理日志
- 模型三大利器之二:修改器
- ThinkPHP5.1.28版本发布——修正上一版本问题,改进关联查询
- 模型三大利器之三:获取器
- API版本控制的几种思路
- ThinkPHP5.2第一个Beta版本发布测试
- 让你少犯错的数据查询基本原则
- ThinkPHP发布5.1.29版本——常规更新
- 这15个好习惯让你更容易升级到5.2
- 如何有效提高ThinkPHP的应用性能
- 让你提高开发效率的查询技巧
- 模型关联查询不完全指南
- 5.2发布Beta2版本——统一和精简大量用法
- ThinkPHP发布5.1.30版本——支持微秒时间字段写入
- ThinkPHP的数据缓存使用
- ThinkPHP5.2安装及入口文件
- ThinkPHP荣获2018 年度最受欢迎中国开源开发框架第1名
- 5.1路由使用心得技巧
- ThinkPHP5.*版本发布安全更新
- ThinkPHP项目及代码规范指北
- 5.2版本的设计规范指导
- ThinkPHP5.1.32版本发布——圣诞快乐
- 利用Trait特性给模型增加乐观锁功能
- 5.2数据库和模型的变化(摘要)
- ThinkPHP模板引擎实现和常见问题
- ThinkPHP5.0.24版本发布——安全更新
- 不忘初心,方得始终——ThinkPHP十三周年报告
- ThinkPHP5+相关资源汇总
- 异步社区ThinkPHP周年庆专享优惠活动
- 5.2路由的调整和改进
- ThinkPHP发布5.1.33版本——包含安全更新
- ThinkPHP扩展开发指南
- ThinkPHP发布5.2Beta3版本
- ThinkPHP发布5.1.34版本——喜迎新年
- ThinkPHP发布5.2RC1版本
- ThinkPHP发布5.1.35版本——常规更新
- 5.2配置类的调整
- 5.2时间查询的改进和优化
- 5.2RC版本升级不完全指导(仅供学习参考)
- ThinkPHP5.2版本正式变更为6.0版本
- ThinkPHP百度云云虚拟主机专享免费活动
- 事件系统以及查询事件、模型事件的使用
- ThinkPHP6.0RC2版本发布——架构升级、精简核心
- ThinkPHP5.1.36LTS版本发布——常规更新
- 新版Session和Cookie设计变化
- ThinkPHP5.1.37版本发布——常规更新
- ThinkPHP6.0RC3版本发布——细节完善,体验优化
- 6.0中间件使用详解
- Composer各大厂商镜像地址
- ThinkPHP6.0发布计划公告
- 「ThinkPHP开发者周刊」招募志愿者
- ThinkPHP6.0日志变化
- ThinkPHP5.1.38版本发布——常规更新
- ThinkPHP6.0RC4版本发布——ORM独立,日志多通道支持
- ThinkORM2.0开发指南上线
- ThinkPHP6.0RC5版本发布——多应用模式独立,中间件机制调整
- ThinkPHP6.0版本发布——程序员节福利
- ThinkPHP5.1.39LTS版本发布——常规更新
- ThinkPHP6.0.1版本发布——圣诞快乐!
- 回顾2019,展望2020!
- ThinkPHPV6.0.2版本发布——2020新春快乐!
- 周年福利系列:Swoole合作优惠
- 亿速云成为ThinkPHPV6.0独家赞助发布商🎉
- 新冠疫情工具和限免资源专题(保持更新中)
- 周年福利系列:创宇信用认证合作优惠
- 周年福利系列:码云企业版限时10%优惠
- 周年福利系列:想天短说抵现优惠
- think-swoole直播:从零开始掌握swoole开发
- 周年福利系列:B2C开源电商ShopXO授权8折优惠
- 周年福利系列:LayuiAdmin 永久授权限时优惠
- ThinkPHP资源导航站上线——构建生态 服务未来
- ThinkPHP官方技术支持服务和应用服务市场上线公测
- ThinkPHP市场精选——推广基本要素
- ThinkPHP市场精选——客服聊天专题
- ThinkPHPV6.0.3版本发布——端午安康
- ThinkPHP开发者扶持计划
- 6.0.3版本关键更新及升级事项
- 「ThinkPHP开发者周刊」改版重启
- ThinkPHP市场精选——企业建站专题
- ThinkPHP 提供统一API接口服务
- ThinkPHP市场精选——直播电商专题
- ThinkAPI服务SDK发布
- 官方服务市场启用独立子域名
- ThinkPHP市场精选——刷脸支付专题
- ThinkAPI推出会员服务计划
- ThinkPHPV6.0.4版本发布——中秋国庆双节快乐
- ThinkPHPV5.1.40版本发布——常规更新
- 1024程序员节福利走一波
- ThinkPHP V6.0.5版本发布——兼容Composer2.0
- 知识图谱应用场景——源论技术沙龙
- ThinkPHP5.*版本改进Composer2.0的兼容
- 官方市场双十一精选推荐
- 技术人做产品有机会么(文末送课程)
- 本周秒杀——古德云售后获客营销系统
- ThinkAPI服务更新——支持接口分组和PHP版本依赖调整
- PHP8新特性盘点
- PHP8新特性系列:构造器属性提升使用及注意事项
- ThinkPHP2021新年寄语
- ThinkPHP V6.0.6&V5.1.41版本发布——兼容PHP8.0
- PHP如何更优雅地调用API接口
- ThinkPHP V6.0.7发布——修正版本
- ThinkAPI服务更新——IP白名单
- 最新版ThinkORM对于时间字段的调整
- ThinkAPI短信接口正式上线
- ThinkPHP V6.0.8版本发布——多环境变量配置支持
- 顶想云写作服务开启第一次公测
- ThinkSSL上线——官方SSL/TLS证书服务
- MDBootstrap国内用户福利——ThinkPHP官方市场首发
- ThinkPHP V6.0.9版本发布——常规更新
- ThinkORM功能盘点——虚拟模型
- 全面支持主流GIT版本库——云写作服务第二次公测
- 云写作服务私有化部署方案之:版本库私有化
- 看云双十一活动
- ThinkPHP V6.0.10LTS发布——兼容PHP8.1
- ThinkPHP V6.0.12发布——命令行兼容8.1
- 顶想云知识管理上线公测——构建企业文档中心和知识库
- 顶想云上线——助力生态数字化建设
- 618活动进行中——官方市场迎来一波更新
- 顶想云知识管理正式上线——看云文档启动迁移服务
- ThinkPHP V6.0.13发布——常规更新
- 顶想云网站助理服务上线——构建产品支持服务
- ThinkPHP发布6.1.0&6.0.14版本——安全更新
- ThinkPHP新版社区上线试运营
- ThinkAPI上架人脸核身接口——助力网站实名认证
- 辞旧迎新——旧版社区停止注册及发帖
- ThinkPHP6.1.2版本发布——兼容PHP8.2