【Laravel入門】15分鐘搞懂Laravel的路由機制

【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

中介層,符合條件的請求在處理前會先執行的內容


分享這篇文章:

關聯文章:

訂閱電子報,索取 Laravel 學習手冊

價值超過 3000 元,包含常用 Laravel 語法與指令!

Laravel 百萬年薪特訓營

從最基礎的 PHP 語法開始,包含所有你該知道的網頁基礎知識,連同 Laravel 從零開始一直到實戰,最後還將告訴你如何找好工作,讓你及早擁有百萬年薪