【Laravel入門】15分鐘搞懂Laravel的路由機制
路由負責管理網站所有的請求行為,根據訪問的網址以及請求動詞(GET.POST)來決定交由哪一個控制器的方法來處理

就像是台北101的一樓服務櫃台,在上樓拜訪前你需要先到櫃台報到,說明來意並確認具備權限後,再由櫃台引導你搭乘電梯到指定樓層的目的地。簡單說,櫃台不負責處理訪客的需求,只將其引導到適合的處理單元
Laravel 框架有支持 MVC 架構,雖然在架構中沒有提到 路由 Router,但其依然扮演著很重要的角色,而且這個角色是在原先的 PHP 開發程式所不具備的

路由檔案
一般使用者透過瀏覽器所進行的請求都會交由routes/web.php來設定,而API相關的請求則是交由routes/api.php來設定。不同的路由檔案會導致路由前綴以及對應的中介層可能都不同
編寫路由規則
Route::get('路徑','App\Http\Controllers\HomeController@index');
| 語法段 | 說明 |
|---|---|
| get | 請求動詞 |
| 路徑 | 網址路徑,不含Domain |
| 控制器 | 8.x版本除了寫明控制器名稱還要包含命名空間 |
| 方法 | 負責處理此請求的控制器方法 |
規則判定由上至下逐一比對,只要符合路徑就傳遞給控制器
8.X之後支援的新寫法
use App\Http\Controllers\HomeController;
Route::get('路徑',[HomeController::class,'index']);
動詞方法
目前支援的有get.post.put.patch.delete.any.match.resource等等
match
能夠讓該路徑同時支援多個動詞,如下例
Route::match(['get','post'],'/','App\Http\Controllers\HomeController@index');
any
能讓該路徑支持所有動詞,如下例
Route::any('/','App\Http\Controllers\HomeController@index');
resource
這個動詞很特殊,它的功能是為該路徑生成CRUD所需的共7組路由規則,詳請請參考控制器(Controller)章節
直接在路由檔裡面耍流氓
你可以不經由控制器裡的方法來處理請求,直接在路由檔內搞定,但不建議這樣做,因為寫在路由的程式碼無法被快取,影響上線後的回應效能,根據官方文件的記載,速度可以差超過20倍
//routes/web.php
Route::get('路徑',function(){
return 'Hello!';
});
直接在路由檔回傳視圖
有時候你會希望直接在路由檔回傳視圖,比如像是網頁政策頁這種不需要取用資料庫資料的頁面,將程式移到控制器顯得有些嘮叨,就能使用這個技巧
下面這個例子,當使用者訪問 /policy ,將回傳 policy.blade.php 視圖
//routes/web.php
Route::view('policy','policy');
路由與控制器
所有的控制器一般都位於app/Http/Controllers資料夾,可建立子資料夾來加以組織,最好把請求的處理邏輯都放在控制器的方法內才是正解
建立檔案的指令:
php artisan make:controller HomeController
路由傳遞參數
//routes/web.php
Route::get('路徑/{id}',function($id){
return 'Hello ' . $id;
});
傳遞多個參數
//routes/web.php
Route::get('路徑/{id}/{name}',function($id,$name){
return 'Hello ' . $id . ',Name is ' . $name;
});
可選擇傳遞參數
//routes/web.php
Route::get('路徑/{id?}',function($id = 1){
return 'Hello ' . $id;
});
Route Model Binding
只要在參數前宣告模型類別,並且路徑參數取為同名,就會自動為你用id進資料庫查詢該表,直接提供model物件給你
必要條件:
- 路徑參數需與函式參數名稱相同
- 函式參數前面需宣告類別,且名稱相同
//routes/web.php
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
設定路由群組
透過建立群組可快速為群組內的所有路由加入相同屬性,比如下面例子中就會裡頭的兩個路由規則加入路徑前綴 demo
//routes/web.php
Route::group(['prefix' => 'demo'],function(){
Route::get('hello', function () {
return 'Hello' ;
});
Route::get('world', function () {
return 'World';
});
});
設定路由名稱
你並非一定要為每個路由建立名稱,但好處是一旦取了名稱,之後就能夠使用 route() 幫助函式傳入路由名稱來生成該路由的絕對網址,以用於超連結裡頭
route() 這功能也有個替代品,就是 url(),不由名稱而是路徑來生成
//routes/web.php
Route::get('demo/{id}','App\Http\Controllers\HomeController@index')->name('home.index');
//resources/views/show.blade.php
<a href="{{ route(‘home.index’, [‘id’=>1]) }}">總覽頁</a>
轉址
外部轉址
//routes/web.php
Route::get('baha',function(){
return redirect(‘https://goblinlab.org');
});
內部轉址
//routes/web.php
Route::get('redirect',function(){
return redirect(url('hello'));
});
相關名詞說明
SPA Single Page Application
將網頁做成類似一般App應用樣貌的一頁式操作
Closure
沒有名稱的匿名函式,一般用於封包程式碼且只用一次
Facade
Laravel所提供的工具類別,包含大量好用的類別函式
Middleware
中介層,符合條件的請求在處理前會先執行的內容



