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)
访问绑定实例:
注意:这适用于 Laravel 5.1。我没有在旧版本上测试过。
【讨论】:
【参考方案4】:如果您没有使用bindings
中间件,或者如果您想在除FormRequest
和Controller
之外的任何其他地方访问绑定的$model
,您可以使用以下内容:
$book = app(Book::class)->resolveRouteBinding(request()->route('book'));
【讨论】:
以上是关于Laravel 在请求中检索绑定模型的主要内容,如果未能解决你的问题,请参考以下文章