Le résolveur de policy se charge de faire correspondre des classes de policy à
chaque objet ressource. Nous fournissons quelques résolveurs pour vous permettre
de commencer, mais vous pouvez créer votre propre résolveur en implémentant
Authorization\Policy\ResolverInterface
. Les résolveurs intégrés sont:
MapResolver
vous permet de faire correspondre des noms de ressources aux
noms de leurs classes de policy, ou à des objets ou des callables.
OrmResolver
résout une policy en appliquant des conventions pour les
objets ORM habituels.
ResolverCollection
vous permet d’agréger plusieurs résolveurs, et de les
exécuter les uns à la suite des autres.
MapResolver
fait correspondre des noms de classes de ressources à des noms
de classes de policy, des objets policy ou des callables:
use Authorization\Policy\MapResolver;
$mapResolver = new MapResolver();
// Mappe une classe de ressource à un nom de classe de policy
$mapResolver->map(Article::class, ArticlePolicy::class);
// Mappe une classe de ressource à une instance de policy.
$mapResolver->map(Article::class, new ArticlePolicy());
// Mappe une classe de ressource à une fonction callable
$mapResolver->map(Article::class, function ($resource, $mapResolver) {
// Renvoie un objet policy.
});
Le OrmResolver
est un résolveur de policy basé sur des conventions pour
l’ORM de CakePHP. L’OrmResolver applique les conventions suivantes:
Les policies se trouvent dans App\Policy
Les classes de policy se terminent avec le suffixe de classe Policy
.
Le OrmResolver peut résoudre des policies pour les types d’objets suivants:
Entities - En utilisant le nom de classe de l’entity.
Tables - En utilisant le nom de classe de la table.
Queries - En utilisant le résultat de la méthode repository()
de la query
pour obtenir un nom de classe.
Les règles suivantes s’appliquent dans tous les cas:
On utilise le nom de classe de la ressource pour générer le nom de classe
d’une policy. Par exemple App\Model\Entity\Bookmark
correspondra à
App\Policy\BookmarkPolicy
.
Les ressources de plugins rechercheront d’abord une policy d’application, par
exemple App\Policy\Bookmarks\BookmarkPolicy
pour
Bookmarks\Model\Entity\Bookmark
.
Si on ne trouve aucune policy d’application en priorité, on recherche une
policy du plugin. Par exemple Bookmarks\Policy\BookmarkPolicy
.
Pour les objets tables, la transformation du nom de table ferait correspondre
App\Model\Table\ArticlesTable
à App\Policy\ArticlesTablePolicy
.
Pour les objets query, la méthode repository()
sera appelée, et une policy
sera générée à partir de la classe de table obtenue.
Le OrmResolver peut être personnalisé par son constructeur:
use Authorization\Policy\OrmResolver;
// Changer pour utiliser un namespace d'application personnalisé.
$appNamespace = 'App';
// Fait correspondre des policies d'un namespace à un autre.
// Ici nous avons mappé des policies pour les classes du namespace ``Blog``
// pour qu'elles soient recherchées dans le namespace ``Cms``.
$overrides = [
'Blog' => 'Cms',
];
$resolver = new OrmResolver($appNamespace, $overrides)
ResolverCollection
vous permet d’agréger plusieurs résolveurs:
use Authorization\Policy\ResolverCollection;
use Authorization\Policy\MapResolver;
use Authorization\Policy\OrmResolver;
$ormResolver = new OrmResolver();
$mapResolver = new MapResolver();
// Vérifie le MapResolver, et se rabat sur l'OrmResolver si une ressource
// n'est pas mappée explicitement.
$resolver = new ResolverCollection([$mapResolver, $ormResolver]);
Vous pouvez écrire votre propre résolveur en implémentant
Authorization\Policy\ResolverInterface
, qui nécessite de définir la méthode
getPolicy($resource)
.