Метод scopeBindings
Метод scopeBindings применяется к объекту маршрута
и включает механизм автоматической привязки моделей
с учётом области видимости. Это позволяет автоматически
разрешать зависимости модели на основе ранее связанных
моделей в том же маршруте. Метод принимает параметр
$bindings, который определяет, какие параметры
должны быть связаны через область видимости.
Синтаксис
<?php
Route::scopeBindings($bindings);
?>
Пример
Рассмотрим базовый пример автоматической привязки с областью видимости. У нас есть модели User и Post, где Post принадлежит User. Мы хотим получить пост конкретного пользователя:
<?php
use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
?>
Пример
В этом примере маршрут автоматически проверит, что пост принадлежит указанному пользователю. Если связь не существует, будет возвращена ошибка 404:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Post extends Model
{
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
?>
Результат выполнения кода при запросе
к /users/1/posts/5, если пост с id=5 принадлежит
пользователю с id=1:
"App\Models\Post object"
Пример
Метод можно использовать с неявной привязкой нескольких моделей в группе маршрутов:
<?php
use App\Models\Category;
use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::prefix('users')->scopeBindings()->group(function () {
Route::get('/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
Route::get('/{user}/posts/{post}/categories/{category}', function (User $user, Post $post, Category $category) {
return $category;
});
});
?>
Пример
Метод можно использовать с кастомными ключами для привязки моделей:
<?php
use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::get('/users/{user:username}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
?>
Результат выполнения кода при запросе
к /users/john/posts/my-article,
если пост принадлежит пользователю с username 'john':
"App\Models\Post object"
Смотрите также
-
метод
bind,
который регистрирует кастомную привязку модели -
метод
where,
который добавляет ограничения на параметры маршрута -
метод
whereNumber,
который ограничивает параметр целым числом -
метод
whereUuid,
который ограничивает параметр UUID форматом