先前已開發微信小程式的RESTFul的Api,使用框架ThinkPHP5.0.24,最近想升級為ThinkPHP6.0.2,目錄結構按下:--app --api --controller --api --controller --api --controller 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 --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]
事在人为