ThinkPHP6..0.2正式版多应用模式下路由定义

浏览:2028 发布日期:2020/02/24 分类:ThinkPHP6专区 关键字: ThinkPHP6 多应用模式 路由定义
以前开发过微信小程序的RESTFul的Api,使用框架ThinkPHP5.0.24,最近想升级为ThinkPHP6.0.2,其中目录结构按下:
--app
--api
--controller
--v1
--Index.php
版本写到路由里还能直接写成如下格式:Route::get('api/:version/home','api/:version.Index/home');而在ThinkPHP6.0.2不再支持,参考https://blog.csdn.net/qq_35422558/article/details/100563723,文中在网站根目录下route文件下创建一个api文件夹,下面是一个route.php的路由文件,结构如
--route
--api
--route.php
app.php
--verdor
在api\route.php中写入Route::get('api/:version/home','api/:version.Index/home')。
经测试无效。(该说法有待更正,见后面补充说明)

通过查阅ThinkPHP6开发手册,已经明确指出路由地址不再支持模块/控制器/操作,仍然支持控制器/操作或类的方法。所以解决方法有三种

第一种:定义到类的方法
上面可以写成Route::get(':version/home','\app\api\controller\:version\index@home'),
若写在api\route\route.php,则访问url为http://localhost/api/v1/home。在应用下路由定义要加上应用名称
若写在route\app.php,则访问url为http://localhost/v1/home。切记不要加任何多余。

第二种:定义到控制器/操作
只能在写在应用目录\route\route.php,经测试route.php文件名可以任意定义。不可以在route\api\route.php定义,测试无效。
Route::get(':version/home',:version.Index/home')
定义时除掉应用名称部分,在访问url时加上,即http://localhost/api/v1/home

第三种:在单应用模式下用多级控制器
--app
--controller
--api
--v1
--Index.php
--admin
--Index.php
--home
--Index.php
此时路由定义在Route\app.php
Route::get('api/:version/home',api.:version.Index/home')


这个问题,看了好多ThinkPHP6教程都没提到,从网上搜索也好多经测试不行,所以总结归纳如下
1、单应用模式多级控制器
将api、v1目录都作为controller的子目录和孙目录,结构如上面,若只是一个项目,感觉这个更合理,这样admin和home都可以使用共同的view和model。

2、多应用模式
首先要安装多应用模式扩展,composer require topthink/think-multi-app
其次删除controller文件夹,php think build api生成应用目录,不用设置auto_multi_app=true,框架是依据是否存在controller来判断是单应用还多应用
在应用目录下新建route目录和其目录下文件route.php,在其中定义路由,不需要应用名称,在访问时的url加上即可。
Route::get(':version/home',:version.Index/home')
对应url:http://localhost/api/v1/home

3、路由到类的方法
这种方法不是常用,但如上面分析,可以在api\route\route.php和route\app.php中定义,但访问的url则不同,前者要加上应用名称api,后者是什么就什么,不要添加任何。

4、如果输入以上url时提示No input file specified.
这个问题可以在http://localhost/index.php加上index.php解决。建议是在public\.htaccess的RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]的index.php后加?
即是RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]


------补充于2020-2-26-----
看了static7和xhadmin中多应用路由定义都是放在route目录下建相应应用文件夹然后再定义路由,经测试有效,这和我上面测试时不符合,本意味需要什么设置,翻遍了也没找到,无赖重新composer下载ThinkPHP6进行测试,最后确定问题所在:
应用目录下Route文件夹和Route目录下应用文件夹不能同时定义路由,只能存在一个,功能是等同的。若同时存在则Route目录下应用文件夹中路由定义无效。
最佳答案
评论( 相关
后面还有条评论,点击查看>>