# 路由組
## 路由組
<https://www.cnblogs.com/wesky/p/10443206.html>
- 路由組允許你在大量路由之間共享路由屬性,例如中間件或命名空間,而不需要為每個路由單獨定義這些屬性。
- 共享屬性應該以數組的形式傳入 `Route::group` 方法的第一個參數中。
### 中間件
要給路由組中所有的路由分配中間件,可以在 group 之前調用`middleware`方法,中間件會依照它們在數組中列出的順序來運行:
```
<pre class="calibre11">```
Route::middleware(['first',?'second'])->group(function?()?{?
???Route::get('/',?function?()?{?
???????//?//?使用?first?和?second?中間件??
???????});
????Route::get('user/profile',?function?()?{??
???????//?//?使用?first?和?second?中間件
????????});
????});
```
```
### 命名空間
另一個常見用例是使用`namespace`方法將相同的 PHP 命名空間分配給路由組的中所有的控制器:
```
<pre class="calibre11">```
Route::namespace('Admin')->group(function?()?{??
??//?在?"App\Http\Controllers\Admin"?命名空間下的控制器
?});
```
```
### 子域名路由
- 子域名可以像路由 URI 一樣被分配路由參數,允許你獲取一部分子域名作為參數給路由或控制器使用。
- 可以在 group 之前調用`domain`方法來指定子域名:
```
<pre class="calibre11">```
Route::domain('{account}.myapp.com')->group(function?()?{?
???Route::get('user/{id}',?function?($account,?$id)?{?
??????????//???
????});
?});
```
```
### 路由前綴
可以用`prefix`方法為路由組中給定的 URL 增加前綴。例如,你可以為組中所有路由的 URI 加上 admin 前綴:
```
<pre class="calibre11">```
Route::prefix('admin')->group(function?()?{?
???Route::get('users',?function?()?{???
????????//?匹配包含?"/admin/users"?的?URL??
???????});
???});
```
```
### 路由名稱前綴
name 方法可以用來給路由組中的每個路由名稱添加一個給定的字符串。 例如,您可能希望以 「admin」為所有分組路由的名稱加前綴。 給定的字符串與指定的路由名稱前綴完全相同,因此我們將確保在前綴中提供尾部的`.`字符:
```
<pre class="calibre11">```
Route::name('admin.')->group(function?()?{?
???Route::get('users',?function?()?{???
????????//?指定路由名為?"admin.users"...??
???})->name('users');});
```
```
## 路由模型綁定
- 當向路由或控制器行為注入模型 ID 時,就需要查詢這個 ID 對應的模型。
- 例如,你可以注入與給定 ID 匹配的整個`User`模型實例,而不是注入用戶的 ID。
### 隱式綁定
Laravel 會自動解析定義在路由或控制器行為中與類型提示的變量名匹配的路由段名稱的 Eloquent 模型。例如:
```
<pre class="calibre11">```
Route::get('api/users/{user}',?function?(App\User?$user)?{?
???return?$user->email;
});
```
```
在這個例子中,由于`$user`變量被類型提示為 Eloquent 模型`App\User`,變量名稱又與 URI 中的`{user}`匹配,因此,Laravel 會自動注入與請求 URI 中傳入的 ID 匹配的用戶模型實例。如果在數據庫中找不到對應的模型實例,將會自動生成 404 異常。
#### 自定義鍵名
如果你想要模型綁定在檢索給定的模型類時使用除`id`之外的數據庫字段,你可以在 Eloquent 模型上重寫`getRouteKeyName`方法:
```
<pre class="calibre11">```
/**
?*?獲取該模型的路由的自定義鍵名。
?*
?*?@return?string
?*/
?public?function?getRouteKeyName(){
?????return?'slug';
??}
```
```
### 顯式綁定
要注冊顯式綁定,使用路由器的`model`方法來為給定參數指定類。在`RouteServiceProvider`類中的`boot`方法內定義這些顯式模型綁定:
```
<pre class="calibre11">```
public?function?boot(){
????parent::boot();
????Route::model('user',?App\User::class);
??}
```
```
接著,定義一個包含`{user}`參數的路由:
```
<pre class="calibre11">```
Route::get('profile/{user}',?function?(App\User?$user)?{?
???//
?});
```
```
因為我們已經將所有`{user}`參數綁定至`App\User`模型,所以`User`實例將被注入該路由。例如,`profile/1`的請求會注入數據庫中 ID 為 1 的`User`實例。
如果在數據庫中找不到匹配的模型實例,就會自動拋出一個 404 異常。
#### 自定義邏輯解析
如果你想要使用自定義的解析邏輯,就使用`Route::bind`方法。傳遞到`bind`方法的`閉包`會接受 URI 中大括號對應的值,并且返回你想要在該路由中注入的類的實例:
```
<pre class="calibre11">```
/**
?*?啟動應用服務。
?*
?*?@return?void
?*/
?public?function?boot(){
?????????parent::boot();????????
?????????Route::bind('user',?function?($value)?{??????????
???????????????return?App\User::where('name',?$value)->first()????abort(404);???
???????????????});
????}
```
```
或者,您可以重寫 Eloquent 模型上的`resolveRouteBinding`方法。 此方法會接受 URI 中大括號對應的值,并且返回你想要在該路由中注入的類的實例:
```
<pre class="calibre11">```
/**
?*?檢索綁定值的模型。
?*
?*?@param??mixed??$value
?*?@return?\Illuminate\Database\Eloquent\Model|null
?*/
?public?function?resolveRouteBinding($value){?
????return?$this->where('name',?$value)->first()????abort(404);
?}
```
```
## 回退路由
使用`Route::fallback`方法, 你可以定義在沒有其他路由匹配傳入請求時執行的路由。通常,未處理的請求會通過應用程序的異常處理程序自動呈現 “404” 頁面。 但是,因為你可以在`routes/web.php`文件中定義`fallback`路由,`web`中間件的所有中間件都將應用到路由中。 當然,你也可以根據需要向這條路由中添加額外的中間件:
```
<pre class="calibre11">```
Route::fallback(function?()?{
????//
?});
```
```
> {note} 回退路由應始終是你應用程序注冊的最后一個路由。
## 訪問控制
Laravel 包含了一個 middleware 用于控制應用程序對路由的訪問。 如果想要使用, 請將`throttle`中間件分配給一個路由或者一個路由組。`throttle`中間件會接收兩個參數,這兩個參數決定了在給定的分鐘數內可以進行的最大請求數。例如,讓我們指定一個經過身份驗證并且用戶每分鐘訪問頻率不超過 60 次的路由組:
```
<pre class="calibre11">```
Route::middleware('auth:api',?'throttle:60,1')->group(function?()?{?
???Route::get('/user',?function?()?{?
??????????//???
???????});
??});
```
```
#### 動態訪問控制
你可以根據已驗證的`User`模型的屬性,指定動態請求的最大值。例如,如果你的`User`模型包含`rate_limit`屬性,則可以將屬性名稱傳遞給`throttle`中間件,以便它用于計算最大請求數:
```
<pre class="calibre11">```
Route::middleware('auth:api',?'throttle:rate_limit,1')->group(function?()?{
????Route::get('/user',?function?()?{??
??????????//??
??????});
??});
```
```
## 表單方法偽造
HTML 表單不支持`PUT`、`PATCH`或`DELETE`行為。所以當你要從 HTML 表單中調用定義了`PUT`、`PATCH`或`DELETE`行為的路由時,你將需要在表單中增加一個隱藏的`_method`輸入標簽。使用`_method`字段的值作為 HTTP 的請求方法:
```
<pre class="calibre11">```
<form?action="/foo/bar"?method="POST">?
??<input?type="hidden"?name="_method"?value="PUT">?
??<input?type="hidden"?name="_token"?value="{{?csrf_token()?}}">
</form>
```
```
你也可以使用`@method`模板指令生成`_method`輸入:
```
<pre class="calibre11">```
<form?action="/foo/bar"?method="POST">
????@method('PUT')
????@csrf
</form>
```
```
## 訪問當前路由
你可以使用 Route facade 上的`current`、`currentRouteName`和`currentRouteAction`方法來訪問處理傳入請求的路由的信息:
```
<pre class="calibre11">```
$route?=?Route::current();
$name?=?Route::currentRouteName();
$action?=?Route::currentRouteAction();
```
```
如果你想知道所有可訪問的方法,可以查看 API 文檔,了解 Route facade 和 Route 實例 的基礎類。
- 基本說明
- 基本操作
- October cms 安裝
- 后臺控制器路徑
- 圖標
- 獲取安裝網上的插件/主題
- 插件構造器使用
- 定時任務
- October后臺控制器
- vscode編輯器
- ajax操作
- 使用
- ajax更新組件
- ajax屬性API
- JavaScript API
- ajax綜合使用
- 主題
- 多語言主題
- 安裝市場主題
- 主題程序處理
- 主題
- 頁面
- 部件
- 布局
- 內容
- 組件
- 媒體
- 主題表單操作
- 表單使用
- 表單后端程序處理
- 插件
- 自定義插件
- 插件說明
- 插件導航條
- 插件數據庫設置
- 插件的設置管理
- 插件的配置文件config
- 組件
- app服務
- app容器
- 擴展行為
- 緩存
- Collection類
- Lazy Collections
- Collection方法
- 助手函數
- 數組助手函數
- 路徑助手函數
- 玄樂助手函數
- 其他助手函數
- 錯誤與記錄
- 事件處理
- HTML頁面
- 文件與目錄操作
- 散列和加密
- 郵件
- 郵件內容
- 郵件發送
- 分頁
- 模板解析器
- 動態解析器語法
- 隊列消息
- 請求與輸入
- 響應
- 視圖
- 路由器
- 配置
- 驗證操作
- 處理錯誤消息
- 錯誤消息與視圖
- 可用的驗證規則
- 有條件的驗證規則
- 驗證數組
- 錯誤消息
- 自定義驗證規則
- 模型操作
- 定義模型與其屬性
- 檢索模型
- 插入與更新
- 刪除模型
- 查詢范圍
- 事件操作
- 關聯操作
- 定義關系
- 關系類型
- 多肽關系
- 關系查詢
- 渴望加載
- 插入模型
- 數據庫操作
- 基本用法
- 數據表結構
- 查詢連貫操作
- 結果檢索
- select子句
- 插入更新
- where子句
- 排序,分組,限制和偏移
- 文件附件
- Collection操作
- 屬性操作
- 系列化json
- 數據庫屬性
- 數據庫行為
- 控制器
- 后臺控制器定義
- 后臺頁面
- 后臺組件
- 后臺表單
- 表單組件
- 表單視圖
- 表單行為
- 后臺列表
- 列表行為
- 列表過濾器
- 可用列類型
- 關系行為
- 關系行為類型
- 擴展關系行為
- 列表排序操作
- 導入導出操作
- 用于與權限
- corlate模板修改
- 修改頂部導航
- laravel問題
- 控制器不存在
- 控制器
- 路由組
- laravel筆記
- laravel 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖