Подтвердить что ты не робот

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 и т.д., но не модель).

Вопрос

Если я привяжу модель к маршруту, как я могу получить эту модель из запроса?

Большое спасибо заранее.

4b9b3361

Ответ 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;
    }
}

Еще чище!