2017-01-24 2 views
0

J'ai besoin d'une politique pour créer des arbres dans un tournoi.Les politiques de Laravel se résolvent bizarrement

Ainsi, Dans mon treeController @ magasin, j'ai:

if (Auth::user()->cannot('generateTree', new Tree(),$tournament)) { 
     throw new AuthorizationException(); 
} 

Et ma politique correspondante est:

TreePolicy.php:

public function generateTree(Tree $tree, Tournament $tournament) 
{ 
    dd($tournament); 
    return ($tournament->user_id == Auth::user()->id); 
} 

Et je reçois:

Type error: Argument 1 passed to App\Policies\TreePolicy::generateTree() must be an instance of App\Tree, instance of App\User given, called in /laravel/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php on line 382 

Quoi Ai-je disparu ???

EDIT: En réponse à @andonovn,

Je l'ai essayé avec:

public function store(User $user, Tree $tree, Tournament $tournament) 
{ 
    dd($tournament); 
} 

Et

if (Auth::user()->cannot('generateTree', Tree::class,$tournament)) { 
     throw new AuthorizationException(); 
    } 

-> il me donne un 403

Ou

$this->authorize('store', $tournament,Tree::class); 

-> il n'entre pas le dd();

La seule façon je l'ai trouvé au travail est de mettre le contenu de la politique dans le contrôleur qui est pas si belle:

if ($tournament->user_id != Auth::user()->id){ 
     throw new AuthorizationException(); 
    } 

EDIT 2: je résous avec qui:

Contrôleur:

if (Auth::user()->cannot('store', [Tree::class,$tournament])) { 
     throw new AuthorizationException(); 
    } 

Dans la politique

public function store(User $user, Tournament $tournament) 
{ 
    return ($tournament->user_id == $user->id); 
} 

Répondre

1

Je crois que le premier argument de generateTree() doit être l'utilisateur authentifié. Essayez de changer à public function generateTree(User $user, Tree $tree, Tournament $tournament)

Edit: également modifier les

+0

ne peut pas méthode pour Auth::user()->cannot('generateTree', [Tree::class, $tournament]) (combiner les paramètres de 2e et 3e dans le tableau, semble comme Laravel est toujours attendre 2 arguments où le 2ème peut être rangée) Vérifiez mon question mise à jour! –

+0

Vérifiez ma réponse mise à jour, j'espère que cela fonctionne :) – andonovn

+0

cela fonctionne bien, mais alors je ne peux pas le faire fonctionner en vue, @if (Auth :: user() -> can ('store', [Tree :: class, $ tournoi])) ne fonctionnent pas –