Laravel Politiques - Comment Passer Plusieurs Arguments à la fonction
Je suis en train d'autoriser des utilisateurs de caractère à supprimer/mettre à jour le post. J'ai été d'utiliser des stratégies pour le faire, mais je ne pouvais passer un paramètre à la fonction politique. Si je passe plus de l'utilisateur et une autre variable, la variable n'est pas transmis à la fonction.
Modèles: l'Utilisateur a beaucoup de personnages, un personnage peut poster plusieurs messages. Donc, pour l'autorisation fins, je dois comparer le post character_id avec le caractère actuel de l'id...-
Par la docs, vous pouvez passer en plus des multiples de la Porte Façade:
Gate::define('delete-comment', function ($user, $post, $comment) {
//
});
Mais je ne pouvais pas trouver de toute façon de le faire avec les politiques. Ce que j'avais à faire était d'injecter de l'objet de Requête pour obtenir l'objet nécessaire pour l'autorisation. Fondamentalement, je n'aurais même pas besoin de l'Utilisateur de l'Objet.
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
À l'aide de l'objet de la Requête fonctionne, mais il se sent très hacky. Est-il une plus belle façon d'atteindre cet objectif?
edit:
Dans le CharacterLocationController
j'ai une méthode show
et je veux autoriser l'action, avant de montrer la ressource.
public function show(Request $request, Character $character, Location $location)
{
$this->authorize([$location, $character]);
...
}
La politique est enregistré comme ceci: 'App\Location' => 'App\Policies\LocationPolicy'
dans le AuthServiceProvider
J'ai perdu le tableau passé à la fonction politique, et il ne renvoie la $location
.
public function show(User $user, $data) {
dd($data); //expecting location and character
return !$location->private || $location->authorized->contains($this->character);
}
OriginalL'auteur Johannes | 2016-04-07
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il est peut-être une certaine confusion ici sur les fonctions qui font ce qu'.
Lorsque vous utilisez
Ou dans le
CommentPolicy
Tout ce que vous faites est de définir les règles. À ce stade, on ne craint pas de se passer quelque chose, seulement que les objets que nous avons reçu peut ou devrait être capable d'interagir les uns avec les autres. La seule différence entre ces deux, c'est lors de l'utilisation de politiques, c'est juste un moyen facile de résumé de toutes vos règles dans un simple et facile à lire en classe. Si vous avez une application avec potentiellement des centaines de tableaux et de modèles, il va devenir confus rapide si vous avez ces règles éparpillées dans votre application de sorte politiques permettrait de garder tout organisé.
C'est quand vous avez réellement vérifier si quelqu'un a la permission de faire quelque chose quand vous devriez être en train de passer ces éléments. Par exemple, lorsque vous effectuez les opérations suivantes,
Ou si, dans le
CommentController
C'est ce que les contrôles des paramètres qui vont être transmis à la politique ou à la
Gate::define
méthode. Selon la documentation, la$user
paramètre est déjà ajouté pour vous alors dans ce cas, vous avez seulement besoin de vous soucier de passer le bon$post
et$comment
en cours de modification.CommentController
exemple, quelle est la politique qui est utilisé alors? Est-il en essayant de résoudre le premier objet dans le tableau transmis?J'ai fait quelques tests et les docs semblent impliquer qu'il va utiliser plusieurs stratégies pour chaque argument passé mais je ne pus jamais obtenir de la politique pour le premier élément du tableau pour obtenir de l'appelé.
Je n'ai pas lu le code de la politiques encore. Ce qui est important à noter est l'ordre des variables comme vous l'aviez dit. Il va appeler la police pour la première variable en fonction de son type.
Quelle a été la farce m'a pas passer les multiples extra arguments dans un tableau. Le Laravel docs pourrait être un peu plus détaillé dans ce domaine. Mais v heureux de trouver le problème.
Prenez soin d'ajouter le nom de la classe à l'ensemble lorsque la méthode n'a pas besoin d'une instance du modèle telles que la création, par exemple,
$this->authorize('create', [Comment::class, $post]);
OriginalL'auteur user3158900