コンテナとその使い方の基本
コンテナの解説に入る前に、まず前回紹介したTwigを利用する上でのコードの問題点の確認から始めましょう。
前回の問題点とコンテナ
前回のコラムで紹介したように、SlimでTwigを利用しようとした場合、毎回Twigクラスをnewする必要があります。その際、引数としてテンプレートファイルフォルダパスを渡す必要があります。また、必要に応じて第2引数として環境設定を連想配列として渡します。さらに、newした後のTwigインスタンスのメソッドを使って値を渡してから使用する場合もあります。
となると、ルーティングコールバック関数内にボイラープレートコードが発生することになります。これを解決するために、例えば以下のように、Twigインスタンスをリターンする関数をどこかに作成する方法もあります。
function getTwigInstance() { $view = new Twig("../templates"); return $view; }
では、こういったインスタンスを生成する関数は、どこに作成すればいいのでしょうか。例えば、インスタンス生成の関数をまとめたファイルを作成する方法もあるでしょう。あるいは、1つのクラスにstaticメソッドの形でまとめてしまう方法もあります。
ところが、そういったファイルを特別に作成しなくても、Slimにはもともとインスタンス生成の関数をまとめておける機能が備わっています。それが「コンテナ」です。
コンテナへの登録方法
ではまず、そのコンテナを使ってインスタンス生成関数を登録してみましょう。コンテナを使うには、index.phpに処理を記述します。リスト1の太字の部分を追記してください。
<?php use Slim\App as App; use Slim\Views\Twig; require_once("../vendor/autoload.php"); $app = new App(); $container = $app->getContainer(); // (1) $container["view"] = function($container) // (2) { $view = new Twig("../templates"); // (3) return $view; // (3) }; require_once("../routes.php"); require_once("../routes4.php"); require_once("../routes5.php"); // (4) $app->run();
コンテナにインスタンス生成関数を登録するには、以下の手順を踏みます。
1. コンテナ本体を取得する。
リスト1の(1)が該当します。SlimのAppクラスは、newした時点で内部にコンテナ本体を保持しています。それを取得するために、AppクラスのメソッドであるgetContainer()を使います。
2. コンテナにインスタンス生成の関数を登録する。
リスト1の(2)が該当します。(1)で取得したコンテナ本体にインスタンス生成の関数を登録するには、配列へのデータ登録のような書式を使います。つまり、
$container["view"]
のように、コンテナを表す変数名の後ろに[]と四角カッコを記述し、中に登録するインスタンスの識別文字列を記述します。ここではviewとしています。これに対して、=の右側にインスタンスを生成する関数を記述します。ここでは、無名関数を使っています。
この関数の引数はコンテナ自身という仕様になっています。無名関数内の処理はインスタンスを生成する処理なので、先に記述したgetTwigInstance()関数の中身と同じものを記述します。それが、リスト1の(3)です。
これで、コンテナからインスタンスを取得する準備が整いました。
コンテナからインスタンスを取得する方法
コンテナからインスタンスを取得する準備が整ったところで、次に、コンテナからインスタンスを取得してみましょう。これは、実際にTwigインスタンスを利用する場面で、ルーティングコールバック関数内の記述となります。リスト1の(4)で今回利用するルーティング登録ファイルを読み込んでいます。この読み込みファイルであるリスト2のroutes5.phpを作成してください。
<?php use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; $app->any("/no5/helloTwigWithContainer", function(Request $request, Response $response, array $args): Response { $view = $this->get("view"); // (1) return $view->render($response, "hello.html"); } );
コードが記述できたら、以下のURLにアクセスしてください。
- http://localhost/firstslim/src/public/no5/helloTwigWithContainer
リスト2では、表示する画面のテンプレートファイルとして前回のリスト3をそのまま利用しています。したがって、前回の図2と同じ図1の画面が表示されれば成功です。
リスト2のコードは、前回記述したリスト4とほぼ同じコードです。違うのは、(1)の部分で、Twigクラスをnewする代わりにコンテナからTwigインスタンスを取得し、それを変数$viewとしています。
この(1)のように、コンテナからインスタンスを取得するには、コールバック関数内で、以下の書式を記述します。
$this->get(インスタンスの識別文字列)
ここで少し補足しておくと、このコールバック関数内に記述した$thisという変数は、コンテナそのものを指します。つまり、上の書式は、コンテナのメソッドget()を呼び出すことで、指定したインスタンスを取得していることになります。