我正在嘗試在 Post Model 中制定政策,我遵循文檔但仍然在 api.php 中始終返回 falseRoute::put('post/{id}','PostController@update')->middleware('auth:api');在后控制器public function update(Request $request, Post $post,$id){ $this->authorize('update',$post); $request->validate(['content'=>'required']); $post = $post->find($id); $post->content = $request->content; $post->save();return response()->json($post, 200);}在后政策public function update(User $user, Post $post) { return $user->id === $post->user_id; }在 AuthServiceProvider 中protected $policies = [ 'App\Post' => 'App\Policies\PostPolicy',];請忽略模型,因為模型工作正常,如果我在控制器中評論 $this->authorize 工作正常,但沒有身份驗證,用戶可以更新模型中的任何內容我使用 api 使用郵遞員進行測試authorization = Bearer 'api_token'
1 回答
明月笑刀無情
TA貢獻1828條經驗 獲得超4個贊
您遇到此問題的原因是因為策略中的更新方法需要模型的已加載實例,但是,在您當前的設置中,您將傳遞模型的未加載/空實例。
您可以通過使用Route Model Binding來解決這個問題。將您的路線更改{id}為{post}:
Route::put('post/{post}','PostController@update')->middleware('auth:api');
然后從您的方法中刪除$id參數:update()
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
$request->validate(['content' => 'required']);
$post->content = $request->content;
$post->save();
return response()->json($post, 200);
}
另外,請注意現在您不必使用find來加載模型,這是因為 Laravel 正在為您加載模型。
路由模型綁定通過查找與 uri 段同名的參數名稱來工作,即{post}在路由和$post方法參數上,并且由于$post類型提示是模型,Laravel 知道使用 的值{post}來加載(查找)Post模型。
- 1 回答
- 0 關注
- 124 瀏覽
添加回答
舉報
0/150
提交
取消
