2016-04-07 39 views
8

投稿を削除/更新するためにユーザーキャラクタを承認しようとしています。私はこれを行うためのポリシーを使用していましたが、ポリシー関数には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); 
} 

答えて

13

ここでは、何の機能が何をしているのかについて多少の混乱があると思います。

あなたは

Gate::define('delete-comment', function ($user, $post, $comment) { 
    // 
}); 

それともCommentPolicy

public function delete(User $user, Post $post, Comment $comment) 
{ 
    return $user->id === $post->user_id; 
} 

内を使用する場合は、あなたがやっているすべてのルールを定義しています。この時点で、私たちは何かを渡すことを心配することはなく、受け取ったオブジェクトはお互いにやりとりすることができます。この2つの唯一の違いは、ポリシーを使用する場合です。これは、すべてのルールを簡単で読みやすいクラスに抽象化する簡単な方法です。何百ものテーブルやモデルを持つアプリを持っている場合、これらのルールをアプリ全体に散らばってしまうと、混乱が早くなり、ポリシーはそれらをすべて整理しておくのに役立ちます。

あなたが実際にこれらのアイテムを渡すときに何かをする権限を持っているかどうかを確認しているときです。たとえば、あなたはパラメータがポリシーまたはGate::defineメソッドに渡すことしようとしているかを制御するものであるCommentController

$this->authorize('delete', [$post, $comment]); 

if (Gate::allows('delete-comment', [$post, $comment])) { 
    // 
} 

場合や、次のようありません。ドキュメントによれば、$userパラメータが既に追加されています。この場合、正しい$post$commentが変更されることを心配する必要があります。

+1

私はまだ1つの質問が残っていますが、明確化のおかげで。ポリシー自体は(雄弁なモデルのような)クラスに添付されているので、ルールは自動的に呼び出されます。これは、適切なタイプのオブジェクトを第2のparemterとして渡すときです。 'CommentController'の例のように配列を渡すと、どのポリシーが使われますか?渡された配列の最初のオブジェクトを解決しようとしていますか? – Johannes

+0

私はいくつかのテストを行いました。ドキュメントは渡された各引数に対して複数のポリシーを使用することを暗示しているようですが、呼び出される配列の最初の項目のポリシーしか取得できませんでした。 – user3158900

+0

私はまだポリシーのコードを読んでいませんでした。注目すべき重要なのは、あなたが言ったように変数の順序です。タイプに応じて、最初の変数のポリシーが呼び出されます。 – Johannes

関連する問題