接續上一章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 Request? 參考底下連結了解
文章同步更新到potato media🔗