2017-05-22 15 views
1

私のLaravel 5.4アプリケーションでは、ユーザーがプロジェクトを作成し、そのプロジェクト内に投稿することができます。Laravel Gateメソッドが呼び出されていない

私はユーザーがアクセス権のないプロジェクト内で投稿を作成したり編集したりしないようにしようとしています。 これを行うには、ここで説明するようにGateを実装しました。https://laravel.com/docs/5.4/authorization#gates ゲートは、ユーザーがプロジェクトのオーナーであるかどうかを確認します。 PostControllerで

Gate::define('create-post', function ($user, $project) { 
    Log::info($project) // !!! Never gets called 
    return $project->owner_id == $user->id; 
}); 

私は門を呼ぶ::問題は、私が呼ばれることは決してありませんゲート用に定義されたコードである引数

if (Gate::denies('create-post', $project)) { 
    abort(403); 
} 

としてプロジェクトを渡し拒否します。代わりに、常にfalseを返し、403エラーに進みます。 しかし、プロジェクトを引数として渡さないとコードが呼び出されますが、それは役に立たなくなります。

また、作成メソッドが1つの引数($ user)しか必要とせず、$プロジェクトを渡そうとするとGateと同じ方法で失敗するので、この場合はポリシーを使用できません。

これはバグですか?この機能を実装する別の方法がありますか?ありがとう。

答えて

0

ポリシーを使用して修正できました。 PostControllerから次に

public function createOrEditPosts(User $user, Project $project) 
{ 
    return $project->owner_id == $user->id; 
} 

私が呼ぶ:私はProjectPolicyで次のメソッドを作成し

$this->authorize('createOrEditPosts', $project)); 

ゲートアプローチが動作しない理由を私はまだ知りません。

1

私は同じ問題があります。 Gate :: allows()の2番目のパラメータが雄弁なモデルであるときに何か問題が発生したようです。

他の変数(オブジェクトでも雄弁なモデルでも)をdenies()に渡すと、Log :: info()が機能します。 私は一日を無駄にして$ user-> can()に切り替えました

関連する問題