iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0
Software Development

新手後端工程師的學習歷程系列 第 21

Day 21 - Laravel Route 篇

tags: 2019鐵人賽 Laravel Route

前言

由於 Laravel 的官方手冊講的雖然很多,但範例說明是在有夠少,我把我自己讀完之後整理一些用法重新闡述一下他的功能,希望大家可以瞭解的更清楚。

支援多種網路請求

可以利用 array 將請求方法放在一起就可以把不同請求放在同一個 route 處理

Route::match(['get', 'post'], '/' , function() {

});

甚至可以直接用 any 代表所有請求方法

Route::any(['/' , function() {

});

利用 route 傳值

  • 方法一:
Route::get('/singledataview', function() {
    return view('singleDataView', ['name' => 'Kao']);
});

Route::get('/multidataview', function() {
    return view('multiDataView', ['name' => 'SoJ', 'age' => 30]);
});

Route::get('/arraydataview', function () {
    return view('arrayDataView', ['data' => ['Kao', 30]]
});
  • 方法二:
Route::get('/', function() {
	  //單筆資料
    return view('welcome')->with('name', 'Kao');
	  //多筆資料
	  return view('welcome')->with(['name' => 'Kao', 'age' =>30]);
	  //回傳array
	  return view('welcome')->with('data', ['Kao', 30, 'value3']);
});
  • 方法三:(自帶變數)
 Route::get('/', function() {

	$name = 'Kao';
	return view('welcome', ['name' => $name]); 
//'name'是 welcome 裡的變數名,$name 是 route 裡的變數名,當然 $name 也可以是 array 資料

	//example
  $data = [
		'Go to the store',
		'Clean the house',
		'Finish	my homework'
	];
	return view('welcome', ['data' => $data]);
});

Route::get('/', function () {

    $name = 'Kao';
    return view('welcome', compact('name'));

});

可選值的參數 (Optional Parameter)

這個方法是可以從 URI 取得特定位置的字串,作為 route 參數使用。除此之外,你甚至可以把那個參數定義成 optional (可選值:亦即可有可無),那麼你在 function 中帶入的參數就可以預設為 null。

Route::get('user/{name?}', function($name = null) {
});

假設有一個 URI 為: http://blog.test/kao
那麼 route 會取得 "kao" 這個字串存在變數 $name中,在 function 中將 $name = "kao" 當成參數帶入。

正規表示式的侷限 (Regular Expression Constraints)

這種做法常常拿來避免使用者刻意手動輸入 URI,導致 route 在讀取參數時,因參數格式錯誤而回饋錯誤訊息。
例如: id 本應是數字, 如果使用者刻意將 URI 該改成 kao123,那麼 route 會因為格式不符合正規表示式,而不會執行 function 內動作。

單一變數

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

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

兩個以上的變數

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

全域侷限 (Global Constraints)

在 App\Providers\RouteServiceProvider.php 中

public function boot() {
	Route::pattern('id', '[0-9]+');
	parent::boot();	
}

與資料模型綁定 (Route Model Binding)

由於 model 我還沒講到,這邊先簡單提一下這個使用方法。

這種使用方法有一個前提條件,就是 model 裡,已經有一個欄位名稱叫 'id',Laravel 會依據 id 找到對應的 model 資料。

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

假設有一個資料表如下

id name email
1 Kao 1@mail.com
2 SoJ 2@mail.com

那麼當 URI 為:http://blog.test/users/1
最終變數 $user 會是一個 object {"id":1,"name":"Kao","email":"1@mail.com"}


上一篇
Day 20 - Laravel Valet 篇
下一篇
Day 22 - Laravel Middleware 篇
系列文
新手後端工程師的學習歷程30

尚未有邦友留言

立即登入留言