2023-09-01|閱讀時間 ‧ 約 8 分鐘

所謂的路由參數及隱試綁定概念?

接續上一章Laravel Request 的概念簡單說明,接下來講 Request 特別的應用,而分享這部分的契機,主要是在新人時期面試時被問到的一題,不知道大家是否有被考過這題? 通常考官的問題:解釋一下關於Laravel 隱式綁定 or 是否聽過隱式綁定?

何謂隱式綁定?

在 Laravel 中,路由參數與隱式綁定是相關的概念。隱式綁定是 Laravel 提供的一種方便的方法,可以讓我們更加方便地處理路由參數,讓我們不需要手動透過參數來查詢資料庫或其它資料儲存系統。

隱式綁定透過 Model Binding 的方式實現。我們可以在路由中定義參數名稱,並在控制器方法的參數中使用相應的 Model 類別來接收這個參數。這個方法會自動根據參數的值查詢相應的資料並返回對應的 Model 實例。

首先先介紹路由參數

在 Laravel 中,可以透過路由參數來取得動態的資料。例如,我們可以設定以下路由:

// routes/web.php
Route::get('/users/{id}', 'UserController@show');

當使用者訪問 /users/1 時,Laravel 會自動將 1 這個值作為 id 的值傳給 UserController@show,我們就可以在 show 方法中取得這個值:。

// UserController@show
public function show($id) {
// $id 為路由參數的值
}

隱式綁定的例子:


Route::get('/users/{user}', 'UserController@show');

public function show(User $user) {
return view('users.show', compact('user'));
}

在上面的例子中,我們使用 {user} 來定義路由參數,並使用 User 類別來接收這個參數。在 show 方法中,我們可以直接使用 $user 來存取相應的 User 實例,而不需要手動查詢資料庫,可以看出其實路由參數與隱式綁定很像吧~

隱式綁定還有很多其他的使用方式,例如使用自定義的查詢器、處理多個路由參數等等。

註:隱式模型綁定不會檢索已被軟刪除的模型。但是,您可以通過使用 withTrashed 方法鏈接到路由的定義中,來指示隱式綁定檢索這些模型,而withTrashed 方法主要是告訴查詢器查詢資料時要包含軟刪除的資料

隱式綁定的其他使用方式

在 Laravel 中,隱式綁定還有很多其他的使用方式。以下是一些常見的例子:

(一)使用自定義的查詢器

在 Laravel 中,我們可以使用自定義的查詢器來處理路由參數。例如,如果我們有一個 Post 模型,並希望能夠根據文章標題來查詢文章,可以使用以下的路由定義:

Route::get('/posts/{post:title}', 'PostController@show');

在上面的例子中,我們使用 {post:title} 來定義路由參數,並使用 Post 類別來接收這個參數。在 Post 模型中,我們可以定義一個自定義的查詢器方法 findByTitle,並在 RouteServiceProvider 中註冊:

class Post extends Model
{
public function scopeFindByTitle($query, $title)
{
return $query->where('title', $title);
}
}

class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
Route::bind('post', function ($value) {
return Post::findByTitle($value)->firstOrFail();
});
}
}

在上面的例子中,我們定義了一個 findByTitle 方法,用來查詢標題等於指定值的文章。在 RouteServiceProvider 中,我們使用 Route::bind 方法來註冊這個路由參數的查詢方式。

透過自定義查詢器做法我們將使用假設瀏覽網址為http://localhost/posts/post-one則 Laravel 將使用路由參數post-one調用 PostController@show 方法,並且在路由參數中將其作為 post:title 的值傳遞給Controller,以便您可以在Controller中處理該文章。


class PostController extends Controller{
public function show(Request $request, Post $post){
// $post 參數會自動綁定到路由中的 {post:title} 參數
// 這意味著 $post 參數包含與路由中的文章標題匹配的文章模型實例
// 您可以透過 $post 參數來獲取文章的屬性
return view('posts.show', ['post' => $post]);
}
}


(二)處理多個路由參數

而在 Laravel 中,也可以同時處理多個路由參數。例如,如果我們有一個 Product 模型,希望能夠根據產品類別和產品 ID 來查詢產品,就可以使用以下的路由定義:

Route::get('/products/{category}/{product}', 'ProductController@show');

在上面的例子中,我們使用 {category}{product} 來定義路由參數,並使用 Product 類別來接收這個參數。在 ProductController 中,我們可以定義一個 show 方法來處理這個請求:

public function show($category, Product $product)
{
// ...
}

在上面的例子中,我們同時接收了 $category$product 兩個參數,分別代表產品類別和產品 ID。由於 $product 參數使用了隱式綁定,Laravel 會自動根據產品 ID 查詢對應的產品。

而更多說明跟範例關於 Laravel 的隱式綁定,亦可以參考官方文件 Laravel Implicit Binding 進一步了解其定義和底層實現。

以上是對於laravel 的路由參數及隱式綁定分享介紹~讓你更方便的對參數做後續的應用處理~希望這份說明能讓大家對 Laravel 中的隱式綁定有更深入的了解。


參考文件

Laravel Implicit Binding

Laravel Route Model Binding

需要理解Laravel Request? 參考底下連結了解

Laravel Request 概念

文章同步更新到potato media🔗

https://www.potatomedia.co/s/lu0NYFr

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.