我試圖授權用戶角色刪除/更新帖子。我正在使用策略來這樣做,但我只能將一個參數傳遞給策略函數。如果我傳遞的不僅是用戶和另一個變量,則該變量不會被傳入該函數。Laravel策略 - 如何將多個參數傳遞到功能
模型:用戶有很多字符,一個角色可以發佈多個帖子。因此,對於授權目的,我會後的character_id當前角色的ID比較...-
每docs,你可以傳遞更多的倍數門門面:
Gate::define('delete-comment', function ($user, $post, $comment) {
//
});
但我不能不管怎麼樣,政策都是這樣做的。我所要做的就是注入Request對象來獲得授權所需的對象。基本上我甚至不需要用戶對象。
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
使用Request對象的工作,但它感覺很hacky。有沒有更好的方法來實現這一目標?
編輯:
在CharacterLocationController
我有一個方法show
,我想展示的資源之前授權的行動。
public function show(Request $request, Character $character, Location $location)
{
$this->authorize([$location, $character]);
...
}
該策略註冊這樣的:'App\Location' => 'App\Policies\LocationPolicy'
在AuthServiceProvider
我甩傳遞給策略功能的陣列,且它僅輸出$location
。
public function show(User $user, $data) {
dd($data); // expecting location and character
return !$location->private || $location->authorized->contains($this->character);
}
感謝您的澄清,儘管我還剩下一個問題。策略本身附屬於類(如雄辯模型),因此當傳遞適當類型的對象作爲第二個參數時,規則會自動調用。如果你傳遞一個數組,就像你在'CommentController'例子中做的那樣,那麼使用什麼策略呢?它試圖解析傳遞數組中的第一個對象嗎? – Johannes
我做了一些測試,文檔似乎暗示它會爲每個傳遞的參數使用多個策略,但我只能獲取數組中第一個項目的策略來調用。 – user3158900
我還沒有閱讀政策的代碼。重要的是要注意變量的順序,就像你說的那樣。它會根據其類型調用第一個變量的策略。 – Johannes