上回提到Laravel架構中有個目錄叫routes,是路由的家。今天要來了解的是Laravel中的Route定義:)
打開web.php
可以看到:
Route::get('/', function () {
return view('welcome');
});
這是最簡單的路由定義,由一個URL跟一個閉包組成,意思是當我們連到 http://yourdomain/
時,會回傳 welcome.blade.php
的內容,這個檔案可以在 resources/views
資料夾中找到。
顯示View的路由也可以這樣定義:
Route::view('/welcome', 'welcome');
兩者效果一樣,不過後者的語法簡便許多。除了GET之外,Laravel也有提供其他類型的路由定義:
Route::post('/', function () {});
Route::put('/', function () {});
Route::delete('/', function () {});
Route::any('/', function () {});
Route::match(['get', 'post'], '/', function () {})
.
.
.
其中match是可以註冊回應多種HTTP動詞的路由,any則是可以註冊回應所有HTTP動詞的路由。
HTTP定義了一組可以分配指定資源跟執行指定動作的請求方法,這些請求方法也可以稱為HTTP動詞。
當然也不是只能放View,路由也可以回傳字串:
Route::get('/Hi', function () {
return 'Hello, world';
});
酷!(星星眼
有時候我們會需要一些參數去顯示對應的畫面,比如我們要從URL去取得參數時:
Route::get('user/{name}', function ($name) {
return 'Hello, '.$name;
});
但這種用法你會發現,如果 /user/
後面沒有接任何字串,頁面就會顯示404。另外有個方法可以解決,選擇性參數。在參數後面加上?,並設定參數的預設值,如下:
Route::get('user/{name?}', function ($name='Anonymous') {
return 'Hello, '.$name;
});
這裡也提一下Laravel內建的CSRF保護機制。每個指向web定義的POST、PUT、DELETE路由都要包含一個CSRF token,中介層會驗證token是否與session中存的一致,確保不會發生CSRF攻擊。
// 原生PHP
<?php echo csrf_field(); ?>
// Blade模板
{{ csrf_field() }}
兩者其實是一樣的意思,在Blade模板中,這個函式會自動生成完整HTML語法,隱藏在文件中。
<!--原生用法-->
<form method="POST" action="/profile">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
...
</form>
<!--Blade模板用法-->
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
相關資料:讓我們來談談 CSRF | TechBridge 技術共筆部落格
不只是上面提到的基本路由,還有路由群組、路由模型,但大概就是經驗差距,光是看文件無法連結到這可以做什麼、用在哪裡。現階段只能先記著有這樣的功能,或許哪天有機會就用上了:)