2016-08-09 8 views
0

私は、ユーザーがページにアクセスできるかどうかをチェックするポリシーを持っています。現在のユーザーと一緒にページの名前がポリシーのメソッドのパラメータです:Laravelのポリシーを確認する

public function pageAllowed(User $user, string $page) 
{ 
    return $this->allGranted($user) || $user->hasPermission(self::PREFIX_PAGE . '.' . $page); 
} 

問題は、私は通常、私がしなければ、ブレードからポリシーを確認することができないということです

@can('page-allowed', [Auth::user(),'page.name']) 
    <li ng-class="{ active: properties.isActive('/feedback')}"><a href="#/feedback">Feedback</a></li> 
@endcan 

その後、Laravelあなたはそれがマージ見ることができるように

return call_user_func_array(
      [$instance, $ability], array_merge([$user], $arguments) 
); 

:なぜならそれはメソッドを呼び出す方法のポリシーのメソッドを呼び出すときに、ユーザーのparamを複製、\Illuminate\Auth\Access\Gate::resolvePolicyCallbackを参照してください、ライン388 ■渡されたパラメータを使用して解決されたユーザー(さらにそれ自体を解決します)。最初に渡されたパラメータは、現在のユーザーです。 2番目はページの名前です。それは、ポリシーのメソッドに渡された次のパラメータで終わる:User, User, 'page.name'。最初の2つのパラメータは同じで、この重複を取り除きたいです。

ブレードからユーザーを渡さないとうれしいですが、この場合、Laravelは最初に渡されたパラメータでポリシーを参照するため、ポリシーを解決できません。ライン346、\Illuminate\Auth\Access\Gate::firstArgumentCorrespondsToPolicy参照してください:私は最初のパラメータとしてユーザーに合格しないのであれば

return is_string($arguments[0]) && isset($this->policies[$arguments[0]]); 

、それはページ名でポリシーを解決しようとします。私は完全に混乱しています。助けてください。

UPDATE

私の代わりに@can声明の方針()ヘルパー

@if(policy(Auth::user())->pageAllowed(Auth::user(),'feedback')) 
       <li ng-class="{ active: properties.isActive('/feedback')}"><a href="#/feedback">Feedback</a></li> 
@endif 

とブレード@Ifステートメントを使用し、不器用な解決策を見つけました。しかし、私は何が間違っているのだろうかと思っています。

答えて

0

私はUserモデルの重複の論理的理由を理解しているようです - Laravelは現在のユーザーをデフォルトですべてのポリシーに最初のパラメータとして渡します。ユーザーモデルのポリシーを作成しました。ポリシーをチェックするときにモデルを渡す必要があります。そのため、重複が発生します。最初のモデルインスタンスはフレームワークに渡され、2番目のモデルインスタンスは私によって渡されます。それがPostモデルの場合、パラメータはUser、Post、...となります。重複はありません。

関連する問題