tanaka's Programming Memo

プログラミングについてのメモ。

SlimPHP Dependency Container(従属コンテナ)

SlimPHPの公式サイト Dependency Container - Slim Framework の意訳です。


Slimは、アプリケーションの依存関係の準備、管理、組み込みのために、Dependencyコンテナを利用します。Slimは、コンテナ機能を支援するためにContainer-Interopインターフェースを実装しています。Slimに組み込まれているコンテナ(Pimpleをベースにしたもの)や、AcclimateやPHP-DIのようなサードバーティ製のコンテナを利用することができます。

コンテナの使い方

Dependencyコンテナを利用する必要はありません。ですが、利用しない場合でもコンテナのインスタンスはSlimアプリケーションのコンストラクタに渡す必要があります。

$container = new \Slim\Container;
$app = new \Slim\App($container);

明示的または暗黙的に、組み込まれたコンテナからサービスを引き出して利用することができます。以下、Slimアプリケーションのルートから明示的にコンテナのインスタンスを取得する例です。

/**
 * Example GET route
 *
 * @param  \Psr\Http\Message\ServerRequestInterface $req  PSR7 request
 * @param  \Psr\Http\Message\ResponseInterface      $res  PSR7 response
 * @param  array                                    $args Route parameters
 *
 * @return \Psr\Http\Message\ResponseInterface
 */
$app->get('/foo', function ($req, $res, $args) {
    $myService = $this->get('myService');

    return $res;
});

以下のように、暗黙的にコンテナからサービスを取得することもできます。

/**
 * Example GET route
 *
 * @param  \Psr\Http\Message\ServerRequestInterface $req  PSR7 request
 * @param  \Psr\Http\Message\ResponseInterface      $res  PSR7 response
 * @param  array                                    $args Route parameters
 *
 * @return \Psr\Http\Message\ResponseInterface
 */
$app->get('/foo', function ($req, $res, $args) {
    $myService = $this->myService;

    return $res;
});

Slimは、アプリケーションのインスタンスが持っていないプロパティを、アプリケーションのコンテナから得るために __get() や __isset() というマジックメソッドを利用します。

実装する必要があるサービス

コンテナは、以下のサービスを実装する必要があります。Slimの組み込みコンテナにはすでに実装されています。サードパーティー製のコンテナを利用する場合は、以下を定義する必要があります。

settings

アプリケーション設定の連想配列に、以下のキーを含めます。

  • httpVersion
  • outputBuffering
  • responseChunkSize
  • determineRouteBeforeAppMiddleware
environment

\Slim\Interfaces\Http\EnvironmentInterface のインスタンスです。

request

\Psr\Http\Message\ServerRequestInterface のインスタンスです。

response

\Psr\Http\Message\ResponseInterface のインスタンスです。

router

\Slim\Interfaces\RouterInterface のインスタンスです。

foundHandler

\Slim\Interfaces\InvocationStrategyInterface のインスタンスです。

errorHandler

アプリケーションのエラー時に呼び出されます。\Psr\Http\Message\ResponseInterface をreturnする必要があり、以下の3つの引数を受け取るようにします。

  1. \Psr\Http\Message\ServerRequestInterface
  2. \Psr\Http\Message\ResponseInterface
  3. \Exception
notFoundHandler

アクセスのあったHTTPリクエストのURIが、アプリケーションで設定したどのルートとも一致しなかった場合に呼ばれます。\Psr\Http\Message\ResponseInterface のインスタンスを return する必要があり、以下の2つの引数を受け取ります。

  1. \Psr\Http\Message\ServerRequestInterface
  2. \Psr\Http\Message\ResponseInterface
notAllowedHandler

アクセスのあったHTTPリクエストのURIは一致するが、メソッドが不一致の時に呼ばれます。\Psr\Http\Message\ResponseInterface のインスタンスを return して、以下の3つの引数を受け取ります。

  1. \Psr\Http\Message\ServerRequestInterface
  2. \Psr\Http\Message\ResponseInterface
  3. Array of allowed HTTP methods
callableResolver

\Slim\Interfaces\CallableResolverInterface のインスタンスです。


以上です。