Laravel 在请求中检索绑定模型

Posted

技术标签:

【中文标题】Laravel 在请求中检索绑定模型【英文标题】:Laravel retrieve binded model in Request 【发布时间】:2015-06-28 18:44:31 【问题描述】:

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

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

问题

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

非常感谢。

【问题讨论】:

作为这个问题的更新:你可能想查看 Laravel 的 authorization 组件。看起来非常适合您的需求! 【参考方案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(现已删除)的答案不同,如果您已经通过路由模型绑定检索到模型,则不会引发另一个查找查询。

但是,我个人也会在这里使用policy,而不是在表单请求中进行授权检查。

【讨论】:

感谢您的回答!我知道这可能会是这样简单的事情,但我自己无法解决!当它允许我接受时,我会接受:) 哇,不知道这个 Laravel 功能!每天学些新东西! :) 如果我理解正确获取路由参数 laravel 会自动理解该参数绑定到哪个实例? @akad0 如果你有这样定义的路由:Route::get('bookings/booking');,那么获取booking 参数将产生绑定到booking 令牌的任何值。 @MartinBean 只是值还是整个实例?查看您的代码,您使用$booking 作为实例并访问它的相关函数owner() 以检索user_id 属性。编辑:或者您只是将实例作为值传递?【参考方案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;
    

更干净!

【讨论】:

【参考方案3】:

要添加到Martin Bean 的答案,您可以仅使用route($param) 访问绑定实例:

类 UpdateRequest 扩展请求 公共函数授权() $booking = $this->route('booking'); 返回 $booking->owner->user_id == $this->user()->id;

注意:这适用于 Laravel 5.1。我没有在旧版本上测试过。

【讨论】:

【参考方案4】:

如果您没有使用bindings 中间件,或者如果您想在除FormRequestController 之外的任何其他地方访问绑定的$model,您可以使用以下内容:

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

【讨论】:

以上是关于Laravel 在请求中检索绑定模型的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Laravel 5 中的请求中检索 url 参数?

如何在多对多关系 Laravel 中检索所有相关模型?

如何在laravel中检索有限数量的相关模型并按相关模型对集合进行排序?

Laravel 表单模型绑定

Laravel:从数据库中检索模型

Laravel 无法检索保存在 POST 请求中的会话数据