2016-08-09 3 views
0

사용자가 페이지에 액세스 할 수 있는지 여부를 확인하는 정책에 메소드가 있습니다. 현재 사용자와 함께 페이지의 이름은 정책의 메소드의 매개 변수입니다 :라라 벨 정책 확인

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 때문에이 메소드를 호출하는 방식 정책의 메소드를 호출하는 사용자 PARAM를 복제, \Illuminate\Auth\Access\Gate::resolvePolicyCallback를 참조 라인 388 :

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

당신은 병합 볼 수 있듯이 ■ 전달 된 매개 변수로 해결 된 사용자 (추가로 자체를 해석 함). 처음 전달 된 매개 변수는 현재 사용자입니다. 두 번째 페이지의 이름입니다. 정책의 메소드에 전달 된 다음 파라미터로 끝납니다 : User, User, 'page.name'. 처음 두 매개 변수는 동일하며이 중복을 제거하려고합니다.

블레이드에서 사용자를 전달하지 않아도 기쁠 것입니다. 그러나이 경우 Laravel은 처음 전달 된 매개 변수로 정책을 조회하므로 정책을 해결할 수 없습니다! 라인 (346), \Illuminate\Auth\Access\Gate::firstArgumentCorrespondsToPolicy 참조 : 내가 처음 PARAM로 사용자를 통과하지 못한 경우에 따라서

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

, 그것은 페이지 이름으로 정책을 해결하려고합니다. 나는 완전히 혼란스러워. 제발 도와 줘. 나는 서투른 솔루션을 발견했습니다

UPDATE는 정책() 도우미

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

대신 @can 문 문 @if 블레이드를 사용합니다. 하지만 내가 뭘 잘못하고 있는지 궁금 하네.

답변

0

좋아, User 모델 복제의 논리적 인 이유를 이해 한 것 같습니다. Laravel은 현재 사용자를 기본적으로 모든 정책에 첫 번째 매개 변수로 전달합니다. 사용자 모델에 대한 정책을 만들었으므로 정책을 확인할 때 모델을 전달해야합니다. 이것이 중복이 발생하는 이유입니다. 첫 번째 모델 인스턴스는 프레임 워크에 의해 전달되고 두 번째 모델 인스턴스는 나에 의해 전달됩니다. Post 모델 인 경우 매개 변수는 User, Post, ...입니다. 중복되지 않습니다.

관련 문제