Zend-framework-service-manager

提供:Dev Guides
移動先:案内検索

Zend Framework-サービスマネージャー

Zend Frameworkには、 zend-servicemanager と呼ばれる強力なサービスロケーターパターンの実装が含まれています。 Zendフレームワークは、そのすべての機能にサービスマネージャーを広く使用しています。 Service Managerは、Zend Frameworkの高レベルの抽象化を提供します。 また、Zend Frameworkの他のすべてのコンポーネントとうまく統合されます。

Service Managerをインストールする

Service Managerコンポーネントは、 composer ツールを使用してインストールできます。

composer require zendframework/zend-servicemanager

まず、すべてのサービスをサービスマネージャーに登録する必要があります。 サービスがサーバーマネージャーシステムに登録されると、最小限の労力でいつでもアクセスできます。 サービスマネージャーは、サービスを登録するための多くのオプションを提供します。 簡単な例は次のとおりです-

use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\InvokableFactory;
use stdClass;
$serviceManager = new ServiceManager([
   'factories' => [stdClass::class => InvokableFactory::class,],
]);

上記のコードは、 Factory オプションを使用して stdClass をシステムに登録します。 これで、次に示すように、サービスマネージャーの* get()*メソッドを使用して、いつでもstdClassのインスタンスを取得できます。

use Zend\ServiceManager\ServiceManager;
$object = $serviceManager->get(stdClass::class);

get()メソッドは取得したオブジェクトを共有するため、get()メソッドを複数回呼び出して返されるオブジェクトは、同一のインスタンスです。 毎回異なるインスタンスを取得するために、サービスマネージャーは* build()*メソッドである別のメソッドを提供します。

use Zend\ServiceManager\ServiceManager;
$a = $serviceManager->build(stdClass::class);
$b = $serviceManager->build(stdClass::class);

サービスマネージャーの登録

サービスマネージャは、コンポーネントを登録するための一連のメソッドを提供します。 最も重要な方法のいくつかは以下のとおりです-

  • 工場方式
  • 抽象ファクトリーメソッド
  • 初期化メソッド
  • デリゲートファクトリメソッド

これらの各項目については、今後の章で詳しく説明します。

ファクトリーメソッド

ファクトリは、基本的に、呼び出し可能オブジェクト、または FactoryInterface (Zend \ ServiceManager \ Factory \ FactoryInterface)を実装するクラスです。

FactoryInterfaceには単一のメソッドがあります-

public function __invoke(ContainerInterface $container, $requestedName, array
   $options = null)

FactoryInterfaceの引数の詳細は次のとおりです-

  • * container(ContainerInterface)*-ServiceManagerの基本インターフェイスです。 他のサービスを取得するオプションを提供します。
  • requestedName -それはサービス名です。
  • options -サービスに必要な追加オプションを提供します。

FactoryInterfaceを実装する単純なクラスを作成し、クラスを登録する方法を見てみましょう。

クラステスト-取得するオブジェクト

use stdClass;
class Test {
   public function __construct(stdClass $sc) {
     //use $sc
   }
}
*Test* クラスはstdClassに依存します。

クラスTestFactory-テストオブジェクトを初期化するクラス

class TestFactory implements FactoryInterface {
   public function __invoke(ContainerInterface $container, $requestedName,
      array $options = null) {
      $dep = $container->get(stdClass::class);
      return new Test($dep);
   }
}

TestFactoryはコンテナを使用してstdClassを取得し、Testクラスのインスタンスを作成して返します。

Zend Frameworkの登録と使用

Zend Frameworkの登録方法と使用方法を理解しましょう。

serviceManager $sc = new ServiceManager([
   'factories' => [stdClass::class => InvokableFactory::class,
      Test::class => TestFactory::class]
]);
$test = $sc->get(Test::class);

サービスマネージャは、 InvokableFactory という特別なファクトリを提供して、依存関係のないクラスを取得します。 たとえば、 stdClass はInvokableFactoryを使用して設定できます。これは、stdClassが他のクラスに依存しないためです。

serviceManager $sc = new ServiceManager([
   'factories' => [stdClass::class => InvokableFactory::class]
]);
$stdC = $sc->get(stdClass::class);
*FactoryInterface* を実装せずに、または *InvokableFactory* を使用せずにオブジェクトを取得する別の方法は、以下に示すインラインメソッドを使用することです。
$serviceManager = new ServiceManager([
   'factories' => [
      stdClass::class => InvokableFactory::class,
      Test::class => function(ContainerInterface $container, $requestedName) {
         $dep = $container->get(stdClass::class);
         return new Test($dep);
      },
   ],
]);

抽象ファクトリーメソッド

時には、オブジェクトを作成する必要があるかもしれませんが、それは実行時にしかわからなくなります。 この状況は、FactoryInterfaceから派生した AbstractFactoryInterface を使用して処理できます。

AbstractFactoryInterfaceは、要求されたインスタンスでオブジェクトを作成できるかどうかをチェックするメソッドを定義します。 オブジェクトの作成が可能な場合、FactoryInterfaceの __ invokemethod を使用してオブジェクトを作成し、それを返します。

AbstractFactoryInterfaceの署名は次のとおりです-

public function canCreate(ContainerInterface $container, $requestedName)

初期化メソッド

Initializerメソッドは、作成済みのサービスに追加の依存関係を注入する特別なオプションです。 それは InitializerInterface を実装し、利用可能な唯一のメソッドの署名は次のとおりです-

public function(ContainerInterface $container, $instance)
function(ContainerInterface $container, $instance) {
   if (! $instance instanceof EventManagerAwareInterface) {
      return;
   }
   $instance->setEventManager($container->get(EventManager::class));
}

上記の例では、メソッドはインスタンスがEventManagerAwareInterfaceタイプかどうかを確認します。 タイプが EventManagerAwareInterface の場合、イベントマネージャーオブジェクトを設定します。 メソッドは依存関係を設定する場合としない場合があるため、信頼性が低く、実行時の問題が多く発生します。

デリゲーターファクトリメソッド

Zend Frameworkは、 DelegatorFactoryInterface を介してデリゲートパターンをサポートしています。 サービスを装飾するために使用できます。

この関数の署名は次のとおりです-

public function __invoke(ContainerInterface $container,
   $name, callable $callback, array $options = null
);

ここでは、 $ callback がサービスインスタンスを修飾します。

怠zyなサービス

遅延サービスは、作成時に完全に初期化されないサービスの1つです。 それらは単に参照され、本当に必要なときにのみ初期化されます。 最良の例の1つはデータベース接続であり、これはすべての場所で必要なわけではありません。 高価なリソースであり、作成に時間がかかるプロセスです。 Zendフレームワークは DelegatorFactoryInterface から派生した LazyServiceFactory を提供します。これは Delegator コンセプトと* ocramiusプロキシマネージャー*と呼ばれるサードパーティプロキシマネージャーの助けを借りて遅延サービスを生成できます。

プラグインマネージャー

プラグインマネージャーは、サービスマネージャーを拡張し、インスタンス検証などの追加機能を提供します。 Zend Frameworkはプラグインマネージャーを広く使用しています。

たとえば、すべての検証サービスは ValidationPluginManager の下にあります。

構成オプション

サービスマネージャには、サービスマネージャの機能を拡張するためのオプションがいくつか用意されています。 それらは shared、shared_by_default および aliases です。 前に説明したように、取得したオブジェクトはデフォルトで要求されたオブジェクト間で共有され、* build()メソッドを使用して個別のオブジェクトを取得できます。 *shared オプションを使用して、共有するサービスを指定することもできます。 shared_by_default は、 shared 機能と同じですが、すべてのサービスに適用されます。

$serviceManager = new ServiceManager([
   'factories' => [
      stdClass::class => InvokableFactory::class
   ],
   'shared' => [
      stdClass::class => false//will not be shared
   ],
   'shared_by_default' => false,//will not be shared and applies to all service
]);
*aliases* オプションを使用して、登録済みサービスに代替名を提供できます。 これには長所と短所があります。 良い面として、サービスの代替の短い名前を提供できます。 しかし、同時に、名前が文脈から外れ、バグを引き起こす可能性があります。
aliases' => ['std' => stdClass::class, 'standard' => 'std']