algolia search

Tìm thấy x bài viết trong xms.

Laravel Scoped Route Binding cho Nested Resource


Scoped Route Binding trong Laravel giúp xử lý resource lồng nhau (nested resources) một cách tự động và an toàn, đặc biệt là đảm bảo mối quan hệ cha-con giữa các model như Order - Item, Warehouse - Product.

❓ Vấn đề

Giả sử bạn có quan hệ như sau:

  • Một Order có nhiều Item
  • Một Warehouse có nhiều Product

Và bạn có route như: /orders/123/items/ABC789

Bạn muốn Laravel tự xác nhận rằng Item ABC789 phải thực sự thuộc về Order 123.

✅ Giải pháp: scoped() trong route binding

Laravel hỗ trợ scoped() để binding model con trong phạm vi model cha.

Ví dụ:

Route::resource('orders.items', OrderItemController::class)->scoped([
    'item' => 'sku',
]);

Laravel hiểu rằng:

  • {order} là model Order
  • {item:sku} là model Item, được tìm qua sku thay vì id
  • Laravel sẽ tìm item thông qua quan hệ items() trong Order → đảm bảo đúng dữ liệu

🔍 Cơ chế hoạt động

Laravel dựa vào:

  • Tên route: orders.items → Laravel mong chờ Order::items()
  • Route URL: /orders/{order}/items/{item:sku}
  • Laravel chạy logic như:
$order->items()->where('sku', 'ABC789')->firstOrFail();

→ thay vì truy xuất item toàn cục

🏗️ Ví dụ khác: Warehouse – Product

Route::resource('warehouses.products', WarehouseProductController::class)->scoped([
    'product' => 'barcode',
]);

Laravel hiểu:

  • Tìm Warehouse trước
  • Sau đó tìm Product theo barcode trong quan hệ $warehouse->products()

Models:

class Warehouse extends Model {
    public function products() {
        return $this->hasMany(Product::class);
    }
}

class Product extends Model {
    public function warehouse() {
        return $this->belongsTo(Warehouse::class);
    }
}

✅ Ưu điểm

Ưu điểm Mô tả
✔ Tự động kiểm tra mối quan hệ Tránh sai lệch dữ liệu
✔ Trả về 404 nếu không hợp lệ Không cần xử lý tay trong controller
✔ RESTful & sạch sẽ Route rõ ràng, logic gọn gàng

🧠 Tổng kết

Tính năng Mô tả
scoped() Ràng buộc model con trong phạm vi model cha
{param:column} Tìm theo cột khác ngoài id
Laravel xử lý Tự động validate, trả 404 nếu sai quan hệ
Code sạch Không cần viết thêm logic kiểm tra

👉 Kết luận

Scoped Route Binding cực kỳ hữu ích trong các hệ thống:

  • E-commerce
  • Inventory
  • Nested admin panel

Giúp bảo vệ dữ liệu và giảm tải xử lý logic kiểm tra quan hệ trong controller.

Nguồn: https://laravel-news.com/route-resource-scoped

Đánh giá bài viết

Thích thì like
Laravel Scoped Route Binding cho Nested Resource
0/5 0 votes

Bình luận

Hiển thị bình luận Facebook