1. Home
  2. PHP
  3. PSR
  4. 【PHP】PSR-11 Container Interface(コンテナインタフェース)

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

  • 公開日
  • 更新日
  • カテゴリ:PSR
  • タグ:PHP,PSR,Interface,PSR-11,Container
【PHP】PSR-11 Container Interface(コンテナインタフェース)

PSR(PHP 標準勧告)

  1. 概要
  2. PSR-1 Basic Coding Standard
  3. PSR-2 Coding Style Guide
  4. PSR-3 Logger Interface
  5. PSR-4 Autoloader
  6. PSR-6 Caching Interface
  7. PSR-7 HTTP Message Interface
  8. PSR-11 Container Interface
  9. PSR-12 Extended Coding Style
  10. PSR-13 Hypermedia Links
  11. PSR-15 HTTP Handlers
  12. PSR-16 Simple Cache
  13. PSR-17 HTTP Factories
  14. PSR-18 HTTP Client

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

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

Contents

  1. 仕様
    1. エントリ識別子
    2. コンテナからの読み取り
    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) は 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;
    }
}

コンテナを使用して 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
{
}

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級