ポリシーリゾルバー

リソースオブジェクトをそれぞれのポリシークラスにマッピングすることは、ポリシーリゾルバによって処理される動作です。 始めるためにいくつかのリゾルバーを提供していますが、Authorization\Policy\ResolverInterfaceを実装することで独自のリゾルバーを作成できます。 組み込みのリゾルバは次のとおりです:

  • MapResolverを使用すると、リソース名をポリシークラス名、またはオブジェクトと呼び出し可能オブジェクトにマップできます。
  • OrmResolverは、一般的なORMオブジェクトに規則ベースのポリシー解決を適用します。
  • ResolverCollectionを使用すると、複数のリゾルバーをまとめて集計し、それらを順番に検索できます。

MapResolverの使用

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の使用

OrmResolverは、CakePHPのORMの規約ベースのポリシーリゾルバです。 OrmResolverは次の規則を適用します:

  1. ポリシーはApp\Policyにあります
  2. ポリシークラスは、Policyクラスのサフィックスで終わります。

OrmResolverは、次のオブジェクトタイプのポリシーを解決できます:

  • エンティティ - エンティティのクラス名を使用します。
  • テーブル - テーブルのクラス名を使用します。
  • クエリ - クエリのrepository()の戻りを使用してクラス名を取得します。

すべての場合に、次のルールが適用されます:

  1. リソースクラス名は、ポリシークラス名を生成するために使用されます。
    例:App\Model\Entity\BookmarkApp\Policy\BookmarkPolicyにマッピングされます
  2. プラグインリソースは、最初にアプリケーションポリシーをチェックします。
    例:Bookmarks\Model\Entity\BookmarkApp\Policy\Bookmarks\BookmarkPolicy
  3. アプリケーションオーバーライドポリシーが見つからない場合、プラグインポリシーがチェックされます。
    例:Bookmarks\Policy\BookmarkPolicy

テーブルオブジェクトの場合、クラス名の変換により、App\Model\Table\ArticlesTableApp\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の使用

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を実装することで、独自のリゾルバーを実装できます。