引言
上一期我們使用laravel提供的開箱即用的路由,控制器,以及模板功能,
簡單地實現了路由到控制器到模板的分發。不過那都是靜態的網頁,
我們還沒有通過接收使用者輸入,動態地返回不同的資料頁。
本期我們為靜態頁面加點“料”。
程式碼時間
動態資料需要接收使用者輸入,不同的輸入值,經過程式處理,給出不同的相應頁面,或者資料。
所以第一步就是從構造動態化的路由開始。
假設我們構造的主路由在 events 下,想要檢視編號42的那個事件,路由這樣傳入:
http://example.dev/events/42
我們處理使用者輸入資料,一般在控制器內完成,首先建立該控制器類,使用命令列腳手架:
php artisan make:controller EventsController
在生成的 EventsController 類內實現 show 方法:
public function show($id)
{
dd($id);
}
該方法接收一個輸入引數,並在函式體內呼叫 dd 方法進行列印並中斷後續邏輯。
只有控制器還不夠,我們還沒有告訴使用者應該從哪個路由訪問該方法,所以需要註冊一條路由:
Route::get('events/{id}', 'EventsController@show');
這樣就把相對應的路由地址,分發到對應的控制器方法了。其中,路由地址內的 {id},
指定了使用者該位置輸入的引數,賦值給 $id 這個變數。然後大家看到 show($id) 就是使用引數接收了使用者的輸入。
此時在瀏覽器內訪問對應url地址,就順利地可以看到 $id 的變數字元的輸出。
定義多個位置引數
當然了,路由內可以接收一個引數,也可以接收多個,這樣更有利於我們通過邏輯判斷,
精準地給使用者分發相對應的資料。
註冊以下路由:
Route::get('events/category/{category}/{subcategory}','EventsController@category');
這裡有兩個位置引數,分別是 category 和 subcategory。如果使用者訪問了正確的url並傳參,
那麼在程式的控制器內,就可以直接訪問 $category 和 $subcategory 這倆變數。
只是為了展示,我們還是手動實現 EventsController 的 category 方法,簡單地列印接收到的位置引數:
public function category($category, $subcategory)
{
dd("Category: {$category} Subcategory: {$subcategory}");
}
如果在瀏覽器內訪問類似 http://example.dev/events/category/php/laravel
,那麼在瀏覽器的內容欄裡,
就會輸出下面的字串:
Category: php Subcategory: laravel
這說明我們成功地接收了使用者通過路由地址傳入的引數。
可選引數的路由
有些資料可能有的情況下有,有的情況下沒有,這就需要我們定義可選引數的路由地址。
宣告起來幾乎和上一節沒有區別,像下面這樣:
Route::get('events/category/{category}/{subcategory?}','EventsController@category');
注意,我們只是在可選引數變數後面追加一個 ? 問號,就可以了。
然後在控制器內,因為該變數可能存在,可能不存在,所以需要給相應位置引數設計預設值。
否則會丟擲類方法引數的異常。
public function category($category, $subcategory = 'all')
{
dd("Category: {$category} Subcategory: {$subcategory}");
}
測試方法與上一節相同,可多一個不傳送 subcategory 的測試,預設會輸出字串 all。
定義路由名稱
只要你閱讀過一些HTML語法結構,應該對 a 標籤不陌生,比如下面這樣的:
<a href="/events/42">Laravel Hacking and Coffee</a>
通常路由設計地都很複雜,非常不容易記憶,或者說也是動態變化的。要是能有一個路由的名稱,
用於標記某條路由地址,那就會方便很多。
laravel允許你手動指定某條路由的名稱,也算是別名,比如這樣:
Route::get('events/{id}', 'EventsController@show')->name('events.show');
那麼上面的那條超連結,就可以在模板內這樣寫:
<a href="{{ route('events.show', ['id' => 42]) }}">Laravel Hacking and Coffee</a>
使用路由別名,然後傳入位置引數,呼叫系統的 route() 助手函式,最終生成的效果一模一樣,
不過 route 函式還有追加協議域名等詳細內容:
<a href="http://example.dev/events/42">Laravel Hacking and Coffee</a>
有了別名之後,書寫更為隨意,印象更為深刻,語義也更容易理解了。
寫在最後
本文通過例項演示瞭如何宣告可以傳引數的動態路由地址,以及路由到控制器的繫結關係,
並簡單列印了控制器內獲取的路由資料。其中,路由別名在web開發中可以起到錦上添花的作用。
Happy coding :-)
我是@程式設計師小助手,持續分享程式設計知識,歡迎關注。
本作品採用《CC 協議》,轉載必須註明作者和本文連結