首先,先來說說怎麼看目前路由狀態。透過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 |
+--------+----------------+--------------+------+---------+--------------+
首先要注意到的是Method
和URI
,這也是在定義路由最基礎的部份,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的GET
、POST
、PUT
、PATCH
、DELETE
、OPTIONS
的請求方法。此外還可以透過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
處理。
除了透過GET
,POST
傳遞參數,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()
Route::middleware()
throttle
middleware
,能夠控制單一位置的請求頻率。Route::middleware()
在發給handler處理之前,可以做更多的 是情 。
更多的事情 (O
謝謝您的糾錯~
已經修正。