文章目錄
- 環境
- 在Controller中獲取Request對象
- 構造器注入
- 操作方法注入
- 繼承BaseController
- 助手函數
- Facade
- 參考
環境
- Windows 11 專業版
- XAMPP 8.2.12
- PHP 8.2.12
- VSCode 1.103.0
在Controller中獲取Request對象
要想在Controller中獲取Request對象,有以下幾種方式:
- 構造器注入
- 操作方法注入
- 繼承BaseController
- 助手函數
- Facade
下面一一舉例說明。
構造器注入
顧名思義,在控制器的構造器里注入Request對象:
namespace app\controller;use think\Request;class Test1 {protected $request;public function __construct(Request $request) {$this->request = $request;}public function foo() {// 使用request對象echo $this->request->pathinfo();}
}
運行結果如下:
注:如果用 curl
命令訪問,如果輸出非常多的信息:
PS C:\> curl.exe --silent -XGET "http://localhost:8000/test1/foo"
test1/foo<style>#think_page_trace {position:fixed; bottom:0; right:0; font-size:14px; width:100%; z-index:999999; color:#000; text-align:left; font-family:'微軟雅黑';}#think_page_trace_tab {display:none; background:white; margin:0; height: 250px;}#think_page_trace_tab_tit {height:30px; padding: 6px 12px 0; border-bottom:1px solid #ececec; border-top:1px solid #ececec; font-size:16px;}#think_page_trace_tab_tit>span {color:#000; padding-right:12px; height:30px; line-height:30px; display:inline-block; margin-right:3px; cursor:pointer; font-weight:700;}#think_page_trace_tab_cont {overflow:auto; height:212px; padding:0; line-height:24px;}
......
......
這是因為開啟了debug模式。其實剛才頁面訪問時,在debug模式下,也返回了同樣多的內容。注意上圖中,在頁面右下角有一個圖標,可以點開,查看debug詳細信息。
如果想要關閉debug信息,打開項目根目錄里的 .env
文件:
APP_DEBUG = false
其默認值是true,改為false即可。
操作方法注入
顧名思義,在控制器的某個方法里注入Request對象:
namespace app\controller;use think\Request;class Test2 {public function foo(Request $request) {echo $request->pathinfo();}
}
運行結果如下:
PS C:\> curl.exe http://localhost:8000/test2/foo
test2/foo
這種方式好像有點怪,因為操作方法本身可以帶參數,現在把request對象也放進來,感覺有點亂。
繼承BaseController
namespace app\controller;use app\BaseController;class Test3 extends BaseController {public function foo() {echo $this->request->pathinfo();}
}
運行結果如下:
PS C:\> curl.exe http://localhost:8000/test3/foo
test3/foo
這種方法比較好。正常情況下,控制器就應該繼承BaseController類,而BaseController類已經通過構造器注入了App對象:
abstract class BaseController {......protected $request;......public function __construct(App $app) {......$this->request = $this->app->request;......
這樣,在子類控制器中,就可以直接使用request對象了。
助手函數
為了方便使用,系統為一些常用的操作方法封裝了助手函數,比如:
app()
config()
dump()
json()
request()
response()
- …
其中 request()
助手函數是獲取當前Request對象,可以在任何需要的時候直接調用。
namespace app\controller;class Test4 {public function foo() {echo request()->pathinfo();}
}
運行結果如下:
PS C:\> curl.exe http://localhost:8000/test4/foo
test4/foo
Facade
可以通過Facade機制來靜態調用請求對象的方法:
namespace app\controller;use think\facade\Request;class Test5 {public function foo() {echo Request::pathinfo();}
}
運行結果如下:
PS C:\> curl.exe http://localhost:8000/test5/foo
test5/foo
注意區分:本例中 use
所引入的Request類和前面的有所不同。
參考
https://doc.thinkphp.cn/v8_0/request.html