以前开发过微信小程序的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')。[b]经测试无效[/b]。
通过查阅ThinkPHP6开发手册,已经明确指出路由地址不再支持模块/控制器/操作,仍然支持控制器/操作或类的方法。所以解决方法有三种
第一种:定义到类的方法上面可以写成Route::get(':version/home','\app\api\controller\:version\index@home'),若写在api\route\route.php,则访问url为http://localhost/[b]api[/b]/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.phpRoute::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]
事在人为