---
# System prepended metadata

title: Laravel controller
tags: [Laravel]

---

# Laravel controller

controller是做拼裝的
業務邏輯放serive
request用表單


記住只有controller的$request是實例,因為她有去註冊service, 其他地方的request都只是type hint的方法

## 介紹
基本controller 是在App\Http\Controllers
可在routeServe那邊看到 這很重要
基本上routeServe裡面會看到 api 跟 web都是用namespace去找到的


所以當你要生成資料夾分類 請用反斜線
ex App\Http\Controllers\good
你要生成這個的controler 請跑 good/controller 相反斜線


**控制器在任何情況下都發揮著巨大的作用 MVC （模型視圖控制器）基於項目。它們實際
上是接受用戶請求、執行某種邏輯，然後返迴響應的“粘合劑”。**




## 進階(拆分controller)(Service)
https://ithelp.ithome.com.tw/articles/10225685
**Service檔案 必須手動新增**

完整應該是這樣
商業邏輯的內容寫在 Service 檔案
驗證用request方法

controller只用 接收並回傳，類似目錄的概念


## 補充資源控制器

如果需要增加額外的路由到預設的資源路由組合之中，需要在呼叫 Route::resource() 前先定義它們；否則 resource() 定義的路由可能會優先於你定義的路由。

懶人包

自定義的路由一律寫在 resource() 之前

use App\Http\Controller\PhotoController;

Route::get('/photos/popular', [PhotoController::class, 'popular']);
Route::resource('photos', PhotoController::class);

## resource綁定model
指定模型資源
如果你使用了路由模型綁定，並且想在資源控制器的方法中使用型別提示，你可以在生成控制器的時候加入 --model 選項，如下例：

`php artisan make:controller PhotoController --resource --model=Photo`

## create 如何加入 外key (加入user_id)
https://www.youtube.com/watch?v=6Woa7mkox48

## 限定欄位的多層資源路由
Laravel的範圍隱式模型綁定功能能夠自動限縮多層綁定讓被解析出來的子模型必定屬於父模型。透過在定義多層資源時使用 scoped() ，就能啟動自動限定欄位並告知 Laravel 該用哪個欄位來查找子資源

```
use App\Http\Controllers\PhotoCommentController;

Route::resource('photos.comments', PhotoCommentController::class)->scoped([
    'comment' => 'slug',
]);
```
這個路由將會註冊一個限定欄位的多層資源路由，可透過以下的 URIs 來進行訪問

`/photos/{photo}/comments/{comment:slug}`

當使用一個自定義鍵的隱式綁定作為多層路由參數時，Laravel 會自動限定查詢範圍，按照預設的命名方式去父類別中查找關聯方法名稱，然後檢索到對應的多層模型。在這種情況下將假定 Photo 模型有一個叫 comments（路由參數名的複數）的關聯方法，通過這個方法可以查找到 Comment 模型


## 多個resource

你也可以通過將陣列傳入到 resources() 的方式來一次性的註冊多個資源控制器：

```
//routes\web.php

Route::resources([
    'photos' => PhotoController::class,
    'posts' => PostController::class,
]);
```

## 部分資源路由
當註冊資源路由時，你可以指定控制器只處理部分行為，而不是預設的所有行為：

//routes\web.php

use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class)->only([
    'index', 'show'
]);

Route::resource('photos', PhotoController::class)->except([
    'create', 'store', 'update', 'destroy'
]);

## API 資源路由
當註冊用於 APIs 的資源路由時，通常需要排除顯示 HTML 畫面的路由（如 create 和 edit ）。為方便起見，你可以使用 apiResource() 自動排除這兩個路由：

```
//routes\api.php

use App\Http\Controllers\PhotoController;

Route::apiResource('photos', PhotoController::class);
```

要快速生成不包含 create 或 edit 方法的用於開發介面的資源控制器，請在執行 make:controller 命令以生成控制器時加入 --api 選項:

```
php artisan make:controller API/PhotoController --api
```

## 在contorller判斷路由
使用該routeIs方法，您可以確定傳入請求是否與命名路由匹配：

if ($request->routeIs('admin.*')) {
    //
}


##  多層資源 朝狀
有時你可能需要定義一個多層的資源型路由。例如，每張照片資源可以被添加了多個評論。那麼可以在路由中使用點語法來註冊資源型控制器：

```
use App\Http\Controllers\PhotoCommentController;

Route::resource('photos.comments', PhotoCommentController::class);
```
該路由會註冊一個多層資源，可使用如下 URI 訪問:

`/photos/{photo}/comments/{comment}`

多層資源範圍限定
Laravel 的 隱式模型綁定 特性可以自動限定多層綁定的範圍，因此已解析的子模型會自動屬於父模型
，比如剛才的例子所抓取的評論都會是該張照片的。定義多層資源路由時，使用 scoped() 可以開啟自動範圍限定，也可以指定 Laravel 應該要用哪個欄位去查詢子模型資源

淺層多層
通常並不完全需要在 URI 中同時擁有父 ID 和子 ID ，因為子 ID 已經是唯一的辨識符。當使用辨識符（如自動遞增的主鍵）來指定 URI 中的模型時，可以選擇使用「淺層多層」的方式定義路由：

```
use App\Http\Controllers\CommentController;

Route::resource('photos.comments', CommentController::class)->shallow();
```

上面的路由定義方式會定義以下路由：

請求動詞		
GET	 

URI	方法
/photos/{photo}/comments

路由名稱
index	photos.comments.index


###### tags: `Laravel`