2019鐵人賽
Laravel
Route
由於 Laravel 的官方手冊講的雖然很多,但範例說明是在有夠少,我把我自己讀完之後整理一些用法重新闡述一下他的功能,希望大家可以瞭解的更清楚。
可以利用 array 將請求方法放在一起就可以把不同請求放在同一個 route 處理
Route::match(['get', 'post'], '/' , function() {
});
甚至可以直接用 any 代表所有請求方法
Route::any(['/' , function() {
});
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'));
});
這個方法是可以從 URI 取得特定位置的字串,作為 route 參數使用。除此之外,你甚至可以把那個參數定義成 optional (可選值:亦即可有可無),那麼你在 function 中帶入的參數就可以預設為 null。
Route::get('user/{name?}', function($name = null) {
});
假設有一個 URI 為: http://blog.test/kao
那麼 route 會取得 "kao" 這個字串存在變數 $name中,在 function 中將 $name = "kao" 當成參數帶入。
這種做法常常拿來避免使用者刻意手動輸入 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]+' ]);
在 App\Providers\RouteServiceProvider.php 中
public function boot() {
Route::pattern('id', '[0-9]+');
parent::boot();
}
由於 model 我還沒講到,這邊先簡單提一下這個使用方法。
這種使用方法有一個前提條件,就是 model 裡,已經有一個欄位名稱叫 'id',Laravel 會依據 id 找到對應的 model 資料。
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
假設有一個資料表如下
id | name | |
---|---|---|
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"}