iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
1
Modern Web

30天成為Laravel萌新系列 第 12

30天成爲Laravel萌新(第11天)- 路由&頁面模板(4)

使用Artisan顯示目前路由狀態

首先,先來說說怎麼看目前路由狀態。透過artisan route:list列出目前路由狀態:

+--------+----------------+--------------+------+---------+--------------+
| Domain | Method         | URI          | Name | Action  | Middleware   |
+--------+----------------+--------------+------+---------+--------------+
|        | GET|HEAD       | /            |      | Closure | web          |
|        | GET|HEAD       | api/user     |      | Closure | api,auth:api |
|        | GET|HEAD       | hello        |      | Closure | web          |
|        | GET|HEAD|..... | hello-world  |      | Closure | web          |
|        | GET|HEAD       | hello/{name} |      | Closure | web          |
+--------+----------------+--------------+------+---------+--------------+

首先要注意到的是MethodURI,這也是在定義路由最基礎的部份,URL在路由定義時就稱作PATH。我們還可以將路由命名(Name);至於Action與以後會提到的控制器(Controller)有關,這裡顯示Closure表示路由由handler function處理請求;最後Middleware預計本系列文章不會提到,又興趣可以去看官方文件

api/user定義在routes/api.php中。

基礎路由方法

基本路由方法有:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

基本上就對應了REST的GETPOSTPUTPATCHDELETEOPTIONS的請求方法。此外還可以透過Route::any($uri, $callback);來直接處理請求,而不管請求方法;或是使用Route::match([$method,...], $uri, $callback);來處理特定請求方法。

請求方法 是HTTP請求裡頭的一個欄位:METHOD。

路由視圖

很多時候只是簡單的渲染頁面模板,雖然可以使用view()選染,但路由提供一個更簡潔的寫法:

Route::view('/hello', 'hello-name', ["name"=>"World"]);

將原本Route::get("/hello")路由換成上面,在用Artisan看一次路由狀態:

+--------+--------------+--------------+------+-----------------------------------+--------------+
| Domain | Method       | URI          | Name | Action                            | Middleware   |
+--------+--------------+--------------+------+-----------------------------------+--------------+
|        | GET|HEAD     | /            |      | Closure                           | web          |
|        | GET|HEAD     | api/user     |      | Closure                           | api,auth:api |
|        | GET|HEAD     | hello        |      | **Illuminate\Routing\ViewController** | web          |
|        | GET|HEAD|....| hello-world  |      | Closure                           | web          |
|        | GET|HEAD     | hello/{name} |      | Closure                           | web          |
+--------+--------------+--------------+------+-----------------------------------+--------------+

相關路由Action部份,已經由預定一控制器ViewController處理。

路由參數

除了透過GETPOST傳遞參數,Laravel也可以很方便的透過路徑(PATH or URI)傳遞參數,Laravel有能力自動匹配。

之前寫的就是一例:

Route::get('/hello/{name}', function ($name) {
    return view("hello-name", [
        "name" => $name,
    ]);
});

可選參數

此外,還可以添加?與預測值,使參數變為可選。我們先刪除剛剛上面修改的Route::view('/hello', 'hello-name', ["name"=>"World"]);,然後添加以下內容,同樣可以達到相同結果:

Route::get('/hello/{name?}', function ($name="World") {
    return view("hello-name", [
        "name" => $name,
    ]);
});

※ 僅僅是刪除的話,原本路徑會顯示404錯誤找不到頁面

正則匹配

可以透過匹配來判斷參數內容是否符合需求,在加以處理。可以這麼做:

Route::get('/number/{number}', function ($number) {
    return $number;
})->where(["number"=>'[0-9]+']);

這樣一來{number}參數就必須是由1個以上的數字組成,否則同樣404找不到頁面。

路由命名

除了where,還可以透過name來對路由命名。拿Route::any('/hello-world/')來試試:

Route::any('/hello-world/', function () {
    return '<h1>Hello, World</h1>';
})->name("hello-world");

同樣用Artisan來看看路由狀態:

+--------+--------------+-----------------+------------------+---------+--------------+
| Domain | Method       | URI             | Name             | Action  | Middleware   |
+--------+--------------+-----------------+------------------+---------+--------------+
|        | GET|HEAD     | /               |                  | Closure | web          |
|        | GET|HEAD     | api/user        |                  | Closure | api,auth:api |
|        | GET|HEAD|POST| hello-world     | hello-world      | Closure | web          |
|        | GET|HEAD ....| hello/{name?}   |                  | Closure | web          |
|        | GET|HEAD     | number/{number} | just test number | Closure | web          |
+--------+--------------+-----------------+------------------+---------+--------------+

※ 當然你也可以透過->where(["number"=>'[0-9]+'])->name("just test number");的方式為number/{number}路由。上面空個的路由命名方式不是很推薦。

重新向導

命名路由可以幹麻。除了在route:list有更明顯的意義以外,可以使其他地方更簡易的是用,像是重新導向

Route::get('redirect', function() {
    // 通过路由名称进行重定向
    return redirect()->route('hello-world');
});

如果你把return的東西改成route('hello-world')會看到實際路徑http://localhost/hello-world

不過可以更簡單的這麼寫:

Route::redirect("/r/hello-world",'/hello-world');

可惜的是RedirectController控制器比較早處理,還不認識route('hello-world'),所以只能寫URI。

路由分組與前綴

還記得說過api.php會自動在路徑上加上api/的前綴嗎?也可以做到類似的事情。替路由分組同樣也有助於維護。

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

除了上面用法,還可以:

Route::group(['prefix'=>'admin'],function(){
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
    Route::get('/{activity_id}',$callback');
});

Group中,允許建立多個路由。此外,第一個字典參數還可以加入豐富的其他設定,像是之前提到的where=>as=>(類似name=>)、namespace=>等設定。

其他進階

Route::還有許許多多的建構方式,以下在簡單提及幾個。

  • Route::fallback()
    處理所以發生HTTP錯誤的請求。設定這個路由可以自定義像是404錯誤的處理方式。不過之後會以更簡單修改錯誤頁面內容。
  • Route::middleware()
    在發給handler處理之前,可以做更多的事情。
  • throttle
    預設定義的一個中間件middleware,能夠控制單一位置的請求頻率。

上一篇
30天成爲Laravel萌新(第10天)- 路由&頁面模板(3)
下一篇
30天成爲Laravel萌新(第12天)- 簡易Blog頁面(上)
系列文
30天成為Laravel萌新32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿展展展
iT邦好手 1 級 ‧ 2019-10-26 09:11:18

Route::middleware()
在發給handler處理之前,可以做更多的 是情

更多的事情 (O

lagagain iT邦新手 2 級 ‧ 2019-10-27 21:02:06 檢舉

謝謝您的糾錯~
已經修正。

/images/emoticon/emoticon37.gif

我要留言

立即登入留言