私は、ユーザーがページにアクセスできるかどうかをチェックするポリシーを持っています。現在のユーザーと一緒にページの名前がポリシーのメソッドのパラメータです: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ステートメントを使用し、不器用な解決策を見つけました。しかし、私は何が間違っているのだろうかと思っています。