# 3分鐘短文:Laravel路由註冊,你必須掌握的“動詞”!

程式設計師小助手發表於2020-10-19

引言

無論是web頁面還是API介面,我們都繞不開的是路由地址,網路資源定位也只能依賴於路由地址,它是銜接網路請求與應用程式的橋樑。

img

本期為大家說一說用laravel註冊路由的那些必知必會的方法。

程式碼時間

遵循程式設計慣例,首先實現一個 hello world 的示例。在路由檔案 routes/web.php 內註冊一個get請求的路徑:

// routes/web.php
Route::get('/', function () {
    return 'Hello, World!';
});

web伺服器配置正確後,我們就可以通過 www.example.com/ 這個路由地址直達該路由。因為路由內傳入了一個閉包,那麼匿名函式的返回值,就會直接返回給 response,並顯示到頁面上。

大家注意,get這個靜態方法,是一個動詞,宣告瞭該請求的方式是 GET 請求。同樣地,我們可以註冊更多的類似路由,在路由檔案內註冊更多的地址:

Route::get('/', function () {
    return view('welcome');
});

Route::get('about', function () {
    return view('about');
});

Route::get('products', function () {
    return view('products');
});

Route::get('services', function () {
    return view('services');
});

上面的4個路由與 hello world 路由不同,我們做了修改,在閉包內返回了一個 view() 方法建立的檢視。這4條路由都是GET方式,如果使用其他HTTP標準的請求方式,可以如下注冊:

Route::post('/', function () {});
Route::put('/', function () {});
Route::delete('/', function () {});
Route::any('/', function () {});
Route::match(['get', 'post'], '/', function () {});

除了使用閉包返回資料,路由註冊也可以指向控制器方法,比如這樣:

Route::get('/', 'WelcomeController@index');

動態路由需要使用者提供更多個輸入引數,所以在規劃路由上,可以使用佔位符接收路由地址的資料,比如這樣寫:

Route::get('users/{id}/friends', function ($id) {
    //
});

位置引數 id 在正確傳入數值之後,就會傳遞到指定的方法內,在此例是 $id。傳遞多個位置引數也是毫無壓力的:

Route::get('users/{userId}/comments/{commentId}', function ($thisIsActuallyTheUserId,$thisisReallyTheCommentId) {
    //
});

我們路由內使用的位置變數,和閉包形參並不相同,這樣也完全可以使用。但是並不推薦,前後保持一致性,有利於bug排查和除錯,是最佳實踐。

有些位置引數,可以填可以不填,並不是強制要求的。或者說,如果不傳的話,給定一個預設值,經過資料處理後返回給使用者也是可以的。那麼可以宣告該位置引數為可選引數,程式碼如下:

Route::get('users/{id?}', function ($id = 'fallbackId') {
    //
});

不僅於此,你還可以直接在路由上對傳入資料進行有效性判斷,把無效的資料攔截到路由層。約束條件支援正規表示式,比如這樣寫:

Route::get('users/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

此處 where 方法接收引數,指定引數 id 必須符合指定的正規表示式,也就是純數字。還可以指定為純字母的正則:

Route::get('users/{username}', function ($username) {
    //
})->where('username', '[A-Za-z]+');

要求 username 傳入的引數只能是多個大小寫字母的組合。如果路由內宣告瞭多個位置引數,且都需要驗證,那麼在 where 方法內傳入引數名 + 正則的陣列即可:

Route::get('posts/{id}/{slug}', function ($id, $slug) {
    //
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);

有了這樣的條件約束方法,你完全可以利用正則的強大的功能,組裝出更強勁的驗證。

寫在最後

本文初步介紹了laravel內註冊一條路由的方法,簡單地講解了位置引數的傳入和接收,以及在路由內新增正規表示式賦能的條件約束方式。都是基礎而且使用的,大家一定要牢固掌握。

Happy coding :-)

我是@程式設計師小助手,專注程式設計知識,圈子動態的IT領域原創作者

本作品採用《CC 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章