Skip to main content

控制器是什麼

不需要把所有請求處理邏輯以閉包定義在路由檔案中,你可以透過「控制器」類別來整理這些行為。 控制器能將相關的請求處理邏輯統整到單一類別。 例如,UserController 類別可以處理與使用者有關的所有請求(顯示、建立、更新、刪除等)。 預設情況下,控制器會存放在 app/Http/Controllers 目錄。

建立控制器

要快速產生新的控制器,可使用 make:controller Artisan 指令。 應用程式的所有控制器預設都會存放在 app/Http/Controllers 目錄。

基本控制器

控制器類別可有數個 public 方法來回應收到的 HTTP 請求。
建立好控制器類別與方法後,就可以像這樣為控制器方法定義路由:
當收到的請求符合指定的路由 URI 時,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 樣板的 createedit 路由。 使用 apiResource 方法可自動排除這 2 條路由。

Middleware 屬性

也可以使用 PHP 屬性為 controller 指定 middleware。
Middleware 屬性也可套用到個別的 controller 方法。指定在方法上的 middleware 會被加到類別層級指定的 middleware 之後。

依賴注入

建構子注入

Laravel 的服務容器負責解析所有 Laravel 控制器的相依。 因此,你可以在控制器的建構子中以型別提示指定所需的相依。 宣告的相依會自動被解析並注入到控制器實例中。

方法注入

除了建構子注入,控制器方法的相依也能以型別提示指定。 方法注入常見的用途,就是將 Illuminate\Http\Request 實例注入到控制器方法中。
若控制器方法同時要接收路由參數,請將路由參數列在其他相依之後。 例如以下路由:
可如下定義控制器方法,同時型別提示 Illuminate\Http\Request 並取得 id 參數。
善用依賴注入,可以在測試時更容易置入 mock,提升程式的可測試性。

下一步

路由

回顧路由的定義方式與與控制器的整合。
最後修改於 2026年8月21日