在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
等等,但不是模型)。
问题
如果我将模型绑定到路径,如何从请求中检索该模型?
非常感谢提前。
答案 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
中间件,或者要访问除$model
和FormRequest
之外的其他任何地方绑定的Controller
,可以使用以下命令:< / p>
$book = app(Book::class)->resolveRouteBinding(request()->route('book'));