リソースオブジェクトをそれぞれのポリシークラスにマッピングすることは、ポリシーリゾルバによって処理される動作です。
始めるためにいくつかのリゾルバーを提供していますが、Authorization\Policy\ResolverInterfaceを実装することで独自のリゾルバーを作成できます。
組み込みのリゾルバは次のとおりです:
MapResolverを使用すると、リソース名をポリシークラス名、またはオブジェクトと呼び出し可能オブジェクトにマップできます。OrmResolverは、一般的なORMオブジェクトに規則ベースのポリシー解決を適用します。ResolverCollectionを使用すると、複数のリゾルバーをまとめて集計し、それらを順番に検索できます。MapResolverを使用すると、リソースクラス名をポリシークラス名、ポリシーオブジェクト、またはファクトリの呼び出し可能オブジェクトにマップできます:
use Authorization\Policy\MapResolver;
$mapResolver = new MapResolver();
// Map a resource class to a policy classname
$mapResolver->map(Article::class, ArticlePolicy::class);
// Map a resource class to a policy instance.
$mapResolver->map(Article::class, new ArticlePolicy());
// Map a resource class to a factory function
$mapResolver->map(Article::class, function ($resource, $mapResolver) {
// Return a policy object.
});
OrmResolverは、CakePHPのORMの規約ベースのポリシーリゾルバです。
OrmResolverは次の規則を適用します:
App\PolicyにありますPolicyクラスのサフィックスで終わります。OrmResolverは、次のオブジェクトタイプのポリシーを解決できます:
repository()の戻りを使用してクラス名を取得します。すべての場合に、次のルールが適用されます:
App\Model\Entity\BookmarkはApp\Policy\BookmarkPolicyにマッピングされますBookmarks\Model\Entity\BookmarkのApp\Policy\Bookmarks\BookmarkPolicyBookmarks\Policy\BookmarkPolicyテーブルオブジェクトの場合、クラス名の変換により、App\Model\Table\ArticlesTableがApp\Policy\ArticlesTablePolicyにマッピングされます。
クエリオブジェクトのrepository()メソッドが呼び出され、結果のテーブルクラスに基づいてポリシーが生成されます。
OrmResolverは、コンストラクターによるカスタマイズをサポートします:
use Authorization\Policy\OrmResolver;
// Change when using a custom application namespace.
$appNamespace = 'App';
// Map policies in one namespace to another.
// Here we have mapped policies for classes in the ``Blog`` namespace to be
// found in the ``Cms`` namespace.
$overrides = [
'Blog' => 'Cms',
];
$resolver = new OrmResolver($appNamespace, $overrides)
ResolverCollectionを使用すると、複数のリゾルバーを一緒に集約できます:
use Authorization\Policy\ResolverCollection;
use Authorization\Policy\MapResolver;
use Authorization\Policy\OrmResolver;
$ormResolver = new OrmResolver();
$mapResolver = new MapResolver();
// Check the map resolver, and fallback to the orm resolver if
// a resource is not explicitly mapped.
$resolver = new ResolverCollection([$mapResolver, $ormResolver]);
getPolicy($resource)メソッドを定義する必要があるAuthorization\Policy\ResolverInterfaceを実装することで、独自のリゾルバーを実装できます。