控制器是什麼
不需要把所有請求處理邏輯以閉包定義在路由檔案中,你可以透過「控制器」類別來整理這些行為。 控制器能將相關的請求處理邏輯統整到單一類別。 例如,UserController 類別可以處理與使用者有關的所有請求(顯示、建立、更新、刪除等)。
預設情況下,控制器會存放在 app/Http/Controllers 目錄。
建立控制器
要快速產生新的控制器,可使用make:controller Artisan 指令。
應用程式的所有控制器預設都會存放在 app/Http/Controllers 目錄。
基本控制器
控制器類別可有數個 public 方法來回應收到的 HTTP 請求。App\Http\Controllers\UserController 類別的 show 方法會被呼叫,並將路由參數傳入方法中。
控制器不必繼承基底類別,但若有共通的方法可以繼承一個基底控制器類別,也會很方便。
單一動作控制器
若某個控制器動作特別複雜,讓整個控制器類別專注處理該單一動作有時會很有幫助。 可透過在控制器內定義單一的__invoke 方法來實現。
make:controller Artisan 指令的 --invokable 選項產生可呼叫的控制器。
資源控制器
如果將應用程式中的每個 Eloquent 模型視為一種「資源」,那麼對每個資源執行相同的操作組合(CRUD)是很常見的做法。 Laravel 的資源路由能以一行程式,將典型的建立 / 讀取 / 更新 / 刪除(CRUD)路由指派給控制器。 可透過make:controller Artisan 指令的 --resource 選項,快速建立能處理這些動作的控制器。
app/Http/Controllers/PhotoController.php 產生控制器。
控制器中會包含每個資源操作對應方法的雛形(stub)。
接著註冊指向該控制器的資源路由。
執行
php artisan route:list 指令可以快速確認應用程式路由的總覽。部分資源路由
在宣告資源路由時,可以指定控制器要處理的動作子集。API 資源路由
若要為 API 宣告資源路由,通常會希望排除顯示 HTML 樣板的create 或 edit 路由。
使用 apiResource 方法可自動排除這 2 條路由。
依賴注入
建構子注入
Laravel 的服務容器負責解析所有 Laravel 控制器的相依。 因此,你可以在控制器的建構子中以型別提示指定所需的相依。 宣告的相依會自動被解析並注入到控制器實例中。方法注入
除了建構子注入,控制器方法的相依也能以型別提示指定。 方法注入常見的用途,就是將Illuminate\Http\Request 實例注入到控制器方法中。
Illuminate\Http\Request 並取得 id 參數。
下一步
路由
回顧路由的定義方式與與控制器的整合。