天天看點

3分鐘短文:Laravel路由加模型等于?

引言

上一章我們用3分鐘時間光速入門了laravel控制的用法,本章不準備說控制器了,說一說另外倆子產品,就是路由Route和模型Model,這倆直接加起來,會有什麼奇思妙想的發生呢?

3分鐘短文:Laravel路由加模型等于?

請大家接着往下看。

代碼時間

還是最早我們講的那種方式,在路由位址上通過位置參數綁定,我們可以擷取到使用者輸入的資料。隻不過,為了與模型檔案對應起來,可以直接在路由處理方法的閉包内調用模型方法,并組裝資料傳回。

比如傳入id數值,傳回查詢後的結果:

Route::get('conferences/{id}', function ($id) {
    $conference = Conference::findOrFail($id);
});           

其中 findOrFail 方法是一個内置的文法糖,用于根據id查詢條目,找不到的抛出404錯誤頁面。上面的路由也是很多地方都在用的通用的做法,可是程式員總是懶惰的,能少寫一行就少寫一行。laravel為我們準備了更多。

隐式綁定

首先來看一下預設的隐式路由模型綁定。

什麼意思呢?就是路由内預設使用某個變量傳入參數,這個鍵名與執行方法變量名相同,那麼系統就會根據傳入的參數,在執行方法内使用依賴注入方式執行個體化一個模型,而執行個體化的方法,恰恰就是傳入的參數的查詢結果集。

說了半天很繞對不對?看一個例子就明白了:

Route::get('conferences/{conference}', function (Conference $conference) {
    return view('conferences.show')->with('conference', $conference);
});           

簡單地說,路由位址内的變量 {conference} 跟執行方法變量名 $conference 撞名了,這個時候系統就會想了,這是要用隐式的綁定模式啊。于是,把 {conference} 的值,作為查詢條件,使用執行方法内的模型 Conference 執行個體化并執行查詢結果,并指派給 $conference 變量。

自定義鍵名

而路由内這個 {conference} 傳什麼數值呢?根據系統預設值,就是 ID。如果你不想用 ID,想用别的列字段進行查詢,那也可以,比如這樣寫:

Route::get('conferences/{conference:title}', function (Conference $conference) {
    return view('conferences.show')->with('conference', $conference);
});           

那麼執行個體化的時候,就認為這個位置參數傳的是 title 字段用于查詢的條件。

懶人寫法

如果整個模型預設都不會用 id 這個字段查詢,那麼在模型内重載實作下述方法即可:

public function getRouteKeyName()
{
    return 'title';
}           

如果需要修改的路由模型綁定字段太多,又不想挨個去寫模型檔案,可不可以集中起來管理呢?是可以的,在檔案 AppProvidersRouteServiceProvider 内手動追加類似以下代碼:

public function boot(Router $router)
{
    parent::boot($router);
    $router->model('title', Conference::class);
}           

在此處寫了,模型内就不用手動實作 getRouteKeyName 方法了。

寫在最後

本文講了一個再實際工程中用的甚至不是太多的一個功能——路由模型綁定,卻能為大家打開思路提供很多幫助。

諸位還記得之前章節我們介紹的使用 slug 方式查詢資料集嗎?那正是典型的路由模型綁定。有興趣的同學可以往前翻一番圖文,或關鍵詞搜尋 slug 就可以愉快地延伸閱讀了。

Happy coding :-)

我是 @程式員小助手 ,專注程式設計知識,圈子動态的IT領域原創作者