Laravel: Прив'язка маршрутів з обмеженнями для керування вкладеними ресурсами

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 26 липня, 2025
Laravel пропонує революційний підхід до роботи з вкладеними ресурсами завдяки автоматичній валідації зв'язків між батьками і дітьми. Хочете дізнатися, як це спростить створення безпечних та зрозумілих URL-структур? Читайте далі

Scoped implicit model binding у Laravel змінює підходи розробників до роботи з вкладеними ресурсами, автоматично забезпечуючи зв'язки між батьківськими і дочірніми елементами. Ця функція усуває потребу в ручній перевірці, покращуючи структуру URL для ієрархічних даних.

Метод scoped дозволяє автоматичну валідацію зв'язків під час визначення вкладених маршрутів:

use App\Http\Controllers\OrderItemController;

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

Ця конфігурація створює URL-адреси у форматі /orders/{order}/items/{item:sku}, де Laravel автоматично перевіряє, що кожен товар належить до свого заданого замовлення.

Laravel використовує правила наіменування для визначення зв'язків між моделями. Фреймворк вважає, що модель батька має метод зв'язку, що відповідає назві параметра маршруту у множині. Коли запит робиться до /orders/123/items/ABC789, Laravel здійснює запит до зв'язку items у моделі Order, щоб знайти товар зі SKU "ABC789".

Яскравий приклад цієї функціональності — створення системи управління запасами для електронної комерції:

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

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

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

class WarehouseProductController extends Controller
{
    public function edit(Warehouse $warehouse, Product $product)
    {
        return view('inventory.edit', compact('warehouse', 'product'));
    }

    public function update(Warehouse $warehouse, Product $product, Request $request)
    {
        $product->update($request->validated());
        return redirect()->route('warehouses.products.show', [$warehouse, $product]);
    }
}

Фреймворк автоматично повертає 404 помилки, якщо спробувати отримати доступ до товарів, які не існують у заданому складі. Структура URL /warehouses/east-coast/products/BAR123456 гарантує цілісність даних без додаткової логіки контролера, при цьому зберігаючи чисті й зрозумілі маршрути