應用程式介面的主要目的就是提供使用者與介面互動(Interaction),其中 URL 可以取得使用者的資訊並且渲染在畫面中,例如 query string,就是透過最基本的 GET request 來獲取信息:
routes
在路由頁面設定想要回應到前端的資訊,有幾種方式:
simple data
回傳簡單的關聯式陣列:
關聯式陣列可以想做類似 javascript 的物件一樣,鍵值對(key-value pair)的形式.
routes/web.php1 2 3 4 5 6 7 8
| Route::get('/greetings', function () { $datas = [ [ "name" => "Abby" ] ]; return $datas; });
|
Views
回傳資料至 blade
模板,渲染 html
routes/web.php1 2 3 4 5 6 7 8
| Route::get('/greetings', function () { $datas = [ [ "name" => "Abby" ] ]; return views('greetings', $datas); });
|
直接將傳遞過來的關聯式陣列 key 傳進來當變數名
resource/views/greetings.blade.php1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Greetings</title> </head> <body> <h1>Hello! {{ $name }}</h1> </body> </html>
|
query string 參數
變數也可以使用既有的 request()
方法承接 URL ?
後方的 key 來渲染到畫面中,讀取 GET 參數:
request()
routes/web.php1 2 3 4 5 6 7 8 9
| Route::get('/cat', function () { $catNumbers = request('catNumbers'); $datas = [ "catNumbers" => strip_tags($catNumbers) ]; return view('cat', $datas); });
|
resource/views/cat.blade.php1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cat Route</title> </head> <body> <h1>這裡有{{ $catNumbers }}隻貓</h1> </body> </html>
|
為了避免 XSS 攻擊注入惡意程式到 app 中,可以為你的 request 包覆 strip_tags()
,動態路由則不需要。
設置概覽資料
若使用者沒有查詢任何關鍵字(例如衣服),可以設立一個預設顯示的資料(例如展示全部商品):
routes/web.php1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Route::get('/cat', function () { $catNumbers = request('catNumbers'); if(isset($catNumbers)) { $datas = [ "catNumbers" => strip_tags($catNumbers) ]; return view('cat', $datas); } else { $datas = [ "catNumbers" => '很多' ]; return view('cat', $datas); } });
|
isset()
方法類似 javascript 的 if (variable === undefined)
,判斷某變數是否存在。
dynamic routes
可以渲染使用者輸入的資料,動態路由使用 {}
將路由變數名稱包起,爾後經過 GET URL 的方式取得信息,路由設定需要傳入變數至回呼函式中接收:
範例1. 對應的動態路由變數需要傳入回呼函式中
routes/web.php1 2 3 4 5 6 7
| Route::get('/dog/{dogName}', function ($dogName) { $datas = [ "name" => "Abby", "dogName" => $dogName ]; return view('routesTest', $datas); });
|
resource/views/greetings.blade.php1 2 3 4 5 6 7 8 9 10 11 12 13
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Greetings</title> </head> <body> <h1>Hello! {{ $name }}</h1> <h2>A dog name {{ $dogName }}</h2> </body> </html>
|
範例2. 傳入多個非必要的動態路由參數
routes/web.php1 2 3 4 5 6 7 8
| Route::get('/shop/{category?}/{item?}', function ($a = null, $b = null) { if(isset($a)) { if(isset($b)) { return "你正在瀏覽商店${a}分類的${b}品項"; } } return '你正在瀏覽商店的所有商品'; });
|
對應的回呼函式必須接收一樣數量的變數當參數,名稱隨意不過最好與路由同名比較直覺,且位置要按照順序!
非必要的路由參數需要設置:
?
放置在{}
內,表示為可選的。
- 非必要路由參數需設置預設值為空
null
才不會噴錯。
評論