2016-08-09 5 views
0

Ich habe eine Methode in einer Richtlinie, die überprüft, ob ein Benutzer auf eine Seite zugreifen kann. Der Name der Seite zusammen mit dem aktuellen Benutzer sind die Parameter der Methode der Politik:Überprüfen von Laravel-Richtlinien

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

Das Problem ist, dass ich normalerweise nicht die Politik von Klinge überprüfen, ob ich

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

dann Laravel tun dupliziert, wenn der Benutzer param wegen der Art der Politik der Methode aufgerufen es die Methode aufruft, siehe \Illuminate\Auth\Access\Gate::resolvePolicyCallback, Linie 388:

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

Wie Sie sehen es zusammenführen können s der aufgelöste Benutzer (er löst ihn zusätzlich selbst auf) mit den übergebenen Parametern. Der erste übergebene Parameter ist der aktuelle Benutzer. Der zweite ist der Name der Seite. Es endet mit den folgenden Parametern, die an die Methode der Richtlinie übergeben werden: User, User, 'page.name'. Die ersten beiden Parameter sind identisch und ich möchte diese Doppelung loswerden.

Ich würde mich freuen, den Benutzer nicht von Blade zu übergeben, aber in diesem Fall Laravel kann die Richtlinie nicht lösen, da es die Richtlinie nach dem ersten übergebenen Parameter sucht! Siehe \Illuminate\Auth\Access\Gate::firstArgumentCorrespondsToPolicy, Linie 346:

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

Also, wenn ich nicht den Benutzer als erster param passieren versucht, die Politik der Seite Namen aufzulösen. Ich bin total verwirrt, bitte hilf mir.

UPDATE

ich eine ungeschickte Lösung gefunden haben, verwenden Sie die Klinge @if Anweisung mit der Politik (Helfer)

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

anstelle der @can Aussage. Aber ich frage mich, was ich falsch mache.

Antwort

0

Okay, ich habe den logischen Grund der Duplizierung des Benutzermodells verstanden - Laravel übergibt den aktuellen Benutzer standardmäßig an alle Richtlinien als ersten Parameter. Ich habe eine Richtlinie für das Benutzermodell erstellt und muss das Modell übergeben, wenn ich die Richtlinie überprüfe. Deshalb passiert die Duplizierung - die erste Modellinstanz wird vom Framework, die zweite von mir übergeben. Wenn es ein Post-Modell wäre, wären die Parameter: Benutzer, Post, ... ohne jegliche Duplizierung.

Verwandte Themen