我正在使用Laravel 5.4并拥有一个名为Order
的模型。
为了测试我已经创建了两个用户和两个订单,每个用户都有一个订单。
我刚刚看到我能够检索不是我当前用户的人的订单。我正在使用Auth::user()->orders
检索用户自己的订单列表。但为了显示特定订单的详细信息,我这样做:
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$order = CustomerOrder::findOrFail($id)->with('products')->get();
return view('order.show')
->with('order', $order);
}
我错过了什么?是否有中间件或某些东西告诉应用程序只允许访问与经过身份验证的用户关联的订单?
编辑:所以我尝试使用政策OrderPolicy
(CRUD)。
政策的view()
功能:
/**
* Determine whether the user can view the customerOrder.
*
* @param \App\User $user
* @param \App\CustomerOrder $customerOrder
* @return mixed
*/
public function view(User $user, CustomerOrder $customerOrder)
{
return $user->id === $customerOrder->user_id;
}
我已在AuthServiceProvider.php
注册了它:
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Adress::class => AdressPolicy::class, //Doesn't work either
Order::class => OrderPolicy::class
];
我仍然可以查看其他用户的订单。
答案 0 :(得分:3)
另一种方法是使用定义的关系并告诉它只检索id为$id
的关系。像这样:
$customerOrder = auth()->user()->orders()->with('products')->find($id);
答案 1 :(得分:1)
您有几个选择。我选择的最佳选择是使用策略。有关这方面的文档可以在这里找到:
https://laravel.com/docs/5.4/authorization
或者可以这样做:
Tuple.Create("time", "x", "y"); //creates a Tuple with 3 elements, aka triple
在您的用户模型上使用订单关系功能。
根据您提供的政策以及您的资源路线,您应该可以:
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$user = request()->user();
$order = $user->orders()->with('products')->find($id)->get();
return view('order.show', compact('order'));
}
答案 2 :(得分:0)
如果您想获得属于经过身份验证的用户的订单,请执行以下操作:
CustomerOrder::where('user_id', auth()->user()->id)->with('products')->find($id);
答案 3 :(得分:0)
请记住,
首先,您要创建政策。
第二,您注册它。
第三,您在常规控制器中使用了$this->authorize('view', $order);
之类的东西。
您缺少第三步,可以在这里找到文档:
[https://laravel.com/docs/5.8/authorization#authorizing-actions-using-policies][1]