3分鐘短文:使用Laravel為靜態頁面加點“料”

ragus發表於2020-09-24

引言

上一期我們使用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');

這裡有兩個位置引數,分別是 categorysubcategory。如果使用者訪問了正確的url並傳參,

那麼在程式的控制器內,就可以直接訪問 $category$subcategory 這倆變數。

只是為了展示,我們還是手動實現 EventsControllercategory 方法,簡單地列印接收到的位置引數:

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 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章