首先,先來說說怎麼看目前路由狀態。透過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()throttlemiddleware,能夠控制單一位置的請求頻率。Route::middleware()
在發給handler處理之前,可以做更多的 是情 。
更多的事情 (O
謝謝您的糾錯~
已經修正。
![]()