Laravel 在 Request 中检索绑定的模型

2022-08-30 12:52:17

是否有任何简单的方法可以在请求中检索路由绑定模型?

我想更新模型,但在更新之前,我想使用 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()
    {
        // Get bound Booking model from route
        $booking = $this->route('booking');

        // Eager-load owner relation if it’s not loaded already
        $booking->loadMissing('owner');

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

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

但是,我个人也会在这里使用策略,而不是在表单请求中放置授权检查。


答案 2

完成显式绑定(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;
    }
}

甚至更干净!


推荐