Laravel 認識路由

應用程式介面的主要目的就是提供使用者與介面互動(Interaction),其中 URL 可以取得使用者的資訊並且渲染在畫面中,例如 query string,就是透過最基本的 GET request 來獲取信息:


routes

在路由頁面設定想要回應到前端的資訊,有幾種方式:

simple data

回傳簡單的關聯式陣列:

關聯式陣列可以想做類似 javascript 的物件一樣,鍵值對(key-value pair)的形式.

routes/web.php
1
2
3
4
5
6
7
8
Route::get('/greetings', function () {
$datas = [
[
"name" => "Abby"
]
];
return $datas;
});

Views

回傳資料至 blade 模板,渲染 html

routes/web.php
1
2
3
4
5
6
7
8
Route::get('/greetings', function () {
$datas = [
[
"name" => "Abby"
]
];
return views('greetings', $datas);
});

直接將傳遞過來的關聯式陣列 key 傳進來當變數名

resource/views/greetings.blade.php
1
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.php
1
2
3
4
5
6
7
8
9
Route::get('/cat', function () {
// 這裡輸入 params key
$catNumbers = request('catNumbers');
$datas = [
"catNumbers" => strip_tags($catNumbers)
];
// return "這裡有${catNumbers}隻貓";
return view('cat', $datas);
});
resource/views/cat.blade.php
1
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.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Route::get('/cat', function () {
// 這裡輸入 params key
$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.php
1
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.php
1
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.php
1
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 '你正在瀏覽商店的所有商品';
});

對應的回呼函式必須接收一樣數量的變數當參數,名稱隨意不過最好與路由同名比較直覺,且位置要按照順序!
非必要的路由參數需要設置:

  1. ?放置在{}內,表示為可選的。
  2. 非必要路由參數需設置預設值為空null才不會噴錯。
Laravel 認識 controller Laravel 專案包初探

評論

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×