RitoLabo

【PHP】PSR-11 Container Interface(コンテナインタフェース)

  • 公開:
  • 更新:
  • カテゴリ: PHP PSR
  • タグ: PHP,PSR,Interface,PSR-11,Container

PSR-11では、依存性注入コンテナの共通インタフェースについて定義しています。

ContainerInterfaceによってフレームワークとライブラリがオブジェクトとパラメータを取得するためにコンテナをどのように使用するかを標準化することを目標としています。

アジェンダ
  1. 仕様
    1. エントリ識別子
    2. コンテナからの読み取り
      1. get()
      2. has()
    3. 例外
    4. 推奨される使用法
  2. パッケージ
  3. インターフェイス

仕様

基本仕様を以下に示します。

エントリ識別子

エントリ識別子は、コンテナ内のアイテムを一意に識別する少なくとも1つの文字のPHP正当な文字列です。 エントリ識別子は不透明な文字列であるため、呼び出し側は文字列の構造が意味的意味を持つと仮定してはなりません。

コンテナからの読み取り

Psr\Container\ContainerInterface は、get()has()の2つのメソッドを公開します。

get()

  • getには必須のパラメータが1つあります。エントリ識別子は文字列でなければなりません。
  • getは何か(混合値)を返すことができ、識別子がコンテナに知られていない場合はNotFoundExceptionInterfaceをスローします。
  • 同じ識別子で取得する2回の連続した呼び出しは、同じ値を返す必要があります。 ただし、実装者の設計やユーザー構成によっては、異なる値が返される可能性があるため、2回の連続した呼び出しで同じ値を得ることに頼るべきではありません。

has()

  • has()は1つのユニークなパラメータをとります(エントリ識別子)。これは文字列でなければなりません。
  • エントリ識別子がコンテナに知られている場合はtrueを返し、そうでない場合はfalseを返す必要があります。
  • has($id)がfalseを返す場合、get($id)はNotFoundExceptionInterfaceをスローする必要があります。

例外

  • コンテナによって直接スローされた例外は、Psr\Container\ContainerExceptionInterfaceを実装する必要があります。
  • 存在しないIDを持つgetメソッドの呼び出しは、Psr\Container\NotFoundExceptionInterfaceをスローする必要があります。

推奨される使用法

オブジェクトが独自の依存関係を取得できるように、コンテナをオブジェクトに渡すべきではありません。これは、コンテナが一般に推奨されていないパターンであるサービスロケータとして使用されることを意味します。

ユーザーはコンテナをオブジェクトに渡すべきではないため、オブジェクトは独自の依存関係を取得できます。 これを行うユーザーは、サービスロケーターとしてコンテナーを使用しています。

サービスロケーターの使用は一般的には推奨されません。以下は悪い例です。コンテナをサービスロケータとして使用しています。

class BadExample
{
public function __construct(ContainerInterface $container)
{
$this->db = $container->get('db');
}
}

代わりに、依存関係を直接注入することを検討してください。

class GoodExample
{
public function __construct($db)
{
$this->db = $db;
}
}

コンテナを使用して$dbオブジェクトを$goodExampleオブジェクトに挿入することができます。

パッケージ

説明されているインタフェースとクラス、および関連する例外は、psr/containerパッケージの一部として提供されています。

PSRコンテナ実装を提供するパッケージは、psr/container-implementation 1.0.0を提供することを宣言する必要があります。

実装が必要なプロジェクトでは、psr/container-implementation 1.0.0が必要です。

インターフェイス

Psr\Container\ContainerInterface
<?php
namespace Psr\Container;

/**
* エントリを読み取るメソッドを公開するコンテナのインターフェイス
*/
interface ContainerInterface
{
/**
* 識別子によるコンテナのエントリを見つけて返す
*
* @param string $id 検索するエントリの識別子
* @throws NotFoundExceptionInterface (この識別子のエントリは見つかりませんでした)
* @throws ContainerExceptionInterface (エントリの取得中にエラーが発生しました)
*
* @return mixed Entry.
*/
public function get($id);

/**
* コンテナが指定された識別子のエントリを返すことができる場合はtrueを返す
* そうでない場合はfalseを返す
*
* has($id)trueを返せばget($id)では例外をスローしないという事ではないが、
* NotFoundExceptionInterfaceは投げない。
*
* @param string $id 検索するエントリの識別子
*
* @return bool
*/
public function has($id);
}
Psr\Container\ContainerExceptionInterface
<?php
namespace Psr\Container;

/**
* コンテナ内の汎用例外を表す基本インタフェース
*/
interface ContainerExceptionInterface
{
}
Psr\Container\NotFoundExceptionInterface
<?php
namespace Psr\Container;

/**
* コンテナにエントリが見つからない場合の例外インターフェイス
*/
interface NotFoundExceptionInterface extends ContainerExceptionInterface
{
}