投稿を削除/更新するためにユーザーキャラクタを承認しようとしています。私はこれを行うためのポリシーを使用していましたが、ポリシー関数には1つのパラメータしか渡すことができませんでした。ユーザーと他の変数より多くを渡すと、変数は関数に渡されません。Laravel Policies - 複数の引数を関数に渡す方法
モデル:ユーザーには複数の文字があり、複数の投稿を投稿することができます。だから、認証目的のために、私は現在の文字のIDで投稿のcharacter_idを比較しなければならない...-
docsごとに、あなたは門ファサードに多くの倍数を渡すことができます。
Gate::define('delete-comment', function ($user, $post, $comment) {
//
});
をしかし、私はcouldnとにかくポリシーでそうすることはできません。私がしなければならなかったのは、認証に必要なオブジェクトを取得するためにRequestオブジェクトを注入することでした。基本的に私はUser Objectは必要ありません。
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
Requestオブジェクトを使用すると動作しますが、非常にハッキリです。これを達成するためのより良い方法はありますか?
編集:CharacterLocationController
で
私は方法show
を持っていると私は、リソースを表示する前にアクションを許可します。ポリシーは、このように登録されて
public function show(Request $request, Character $character, Location $location)
{
$this->authorize([$location, $character]);
...
}
:AuthServiceProvider
に'App\Location' => 'App\Policies\LocationPolicy'
Iは、ポリシー関数に渡された配列をダンプし、それだけ$location
を出力します。
public function show(User $user, $data) {
dd($data); // expecting location and character
return !$location->private || $location->authorized->contains($this->character);
}
私はまだ1つの質問が残っていますが、明確化のおかげで。ポリシー自体は(雄弁なモデルのような)クラスに添付されているので、ルールは自動的に呼び出されます。これは、適切なタイプのオブジェクトを第2のparemterとして渡すときです。 'CommentController'の例のように配列を渡すと、どのポリシーが使われますか?渡された配列の最初のオブジェクトを解決しようとしていますか? – Johannes
私はいくつかのテストを行いました。ドキュメントは渡された各引数に対して複数のポリシーを使用することを暗示しているようですが、呼び出される配列の最初の項目のポリシーしか取得できませんでした。 – user3158900
私はまだポリシーのコードを読んでいませんでした。注目すべき重要なのは、あなたが言ったように変数の順序です。タイプに応じて、最初の変数のポリシーが呼び出されます。 – Johannes