リソースオブジェクトをそれぞれのポリシークラスにマッピングすることは、ポリシーリゾルバによって処理される動作です。
始めるためにいくつかのリゾルバーを提供していますが、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\BookmarkPolicy
Bookmarks\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
を実装することで、独自のリゾルバーを実装できます。