Laravel извлекает связанную модель в запросе
Есть ли какой-либо простой способ получения модели, привязанной к маршруту, в запросе?
Я хочу обновить модель, но прежде чем это сделать, я хочу выполнить некоторые проверки разрешений с помощью метода Requests authorize()
. Но я хочу, чтобы владелец модели смог обновить его.
В контроллере я бы просто сделал что-то вроде этого:
public function update(Request $request, Booking $booking)
{
if($booking->owner->user_id === Auth::user()->user_id)
{
// Continue to update
}
}
Но я ищу сделать это в запросе, а не в контроллере. Если я это сделаю:
dd(Illuminate\Http\Request::all());
Он дает мне только свойства скалярной формы (например, _method
и т.д., но не модель).
Вопрос
Если я привяжу модель к маршруту, как я могу получить эту модель из запроса?
Большое спасибо заранее.
Ответы
Ответ 1
Абсолютно! Его подход я даже использую сам.
Вы можете получить текущий маршрут в запросе, а затем любые параметры, например:
class UpdateRequest extends Request
{
public function authorize()
{
$booking = $this->route('booking');
return $booking->owner->user_id == $this->user()->id;
}
}
В отличие от smartman s (теперь удалено) ответ, это не приведет к другому запросу поиска, если вы уже получили модель с привязкой к маршрутной модели.
Ответ 2
Чтобы добавить к Martin Bean ответ, вы можете получить доступ к связанному экземпляру, используя только route($param)
:
class UpdateRequest extends Request
{
public function authorize()
{
$booking = $this->route('booking');
return $booking->owner->user_id == $this->user()->id;
}
}
Примечание: Это работает в Laravel 5.1. Я не тестировал это в более старых версиях.
Ответ 3
Как только вы сделали свое явное привязку (https://laravel.com/docs/5.5/routing#route-model-binding), вы действительно можете получить свою модель напрямую с помощью $this.
class UpdateRequest extends Request
{
public function authorize()
{
return $this->booking->owner->user_id == $this->booking->user()->id;
}
}
Еще чище!