Laravel在Request中检索绑定模型

时间:2015-04-21 14:24:13

标签: php laravel laravel-5

在Request中检索路由绑定模型是否有简单的方法?

我想更新模型,但在此之前,我想使用请求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等等,但不是模型)。

问题

如果我将模型绑定到路径,如何从请求中检索该模型?

非常感谢提前。

4 个答案:

答案 0 :(得分:43)

绝对!这是我甚至自己使用的方法。

您可以在请求中获取当前路由,然后获取任何参数,如下所示:

class UpdateRequest extends Request
{
    public function authorize()
    {
        $booking = $this->route('booking');

        return $booking->owner->user_id == $this->user()->getKey();
    }
}

smartman(现已删除)的答案不同,如果您已通过路径模型绑定检索了模型,则不会产生另一个查找查询。

答案 1 :(得分: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。我没有在旧版本上测试过这个。

答案 2 :(得分:0)

一旦你做了明确的绑定(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;
    }
}

更干净!

答案 3 :(得分:0)

如果您不使用bindings中间件,或者要访问除$modelFormRequest之外的其他任何地方绑定的Controller,可以使用以下命令:< / p>

$book = app(Book::class)->resolveRouteBinding(request()->route('book'));