Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Slimのコンテナ機能を使ってみよう

軽量PHPフレームワークSlimを習得しよう 第5回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2019/07/11 11:00

 本連載では軽量PHPフレームワークであるSlimを紹介していきます。フレームワークといえば、重厚長大なもの、いわゆるフルスタックフレームワークが多い中で、あえて軽量フレームワークを取り上げます。軽量ゆえのメリットを味わっていただこうと思います。前回は、テンプレートエンジンTwigとSlimを連携させる方法を紹介しました。今回はSlimのコンテナ機能を紹介します。

目次

コンテナとその使い方の基本

 コンテナの解説に入る前に、まず前回紹介したTwigを利用する上でのコードの問題点の確認から始めましょう。

前回の問題点とコンテナ

 前回のコラムで紹介したように、SlimでTwigを利用しようとした場合、毎回Twigクラスをnewする必要があります。その際、引数としてテンプレートファイルフォルダパスを渡す必要があります。また、必要に応じて第2引数として環境設定を連想配列として渡します。さらに、newした後のTwigインスタンスのメソッドを使って値を渡してから使用する場合もあります。

 となると、ルーティングコールバック関数内にボイラープレートコードが発生することになります。これを解決するために、例えば以下のように、Twigインスタンスをリターンする関数をどこかに作成する方法もあります。

function getTwigInstance()
{
	$view = new Twig("../templates");
	return $view;
}

 では、こういったインスタンスを生成する関数は、どこに作成すればいいのでしょうか。例えば、インスタンス生成の関数をまとめたファイルを作成する方法もあるでしょう。あるいは、1つのクラスにstaticメソッドの形でまとめてしまう方法もあります。

 ところが、そういったファイルを特別に作成しなくても、Slimにはもともとインスタンス生成の関数をまとめておける機能が備わっています。それが「コンテナ」です。

コンテナへの登録方法

 ではまず、そのコンテナを使ってインスタンス生成関数を登録してみましょう。コンテナを使うには、index.phpに処理を記述します。リスト1の太字の部分を追記してください。

[リスト1]firstslim/src/public/index.php
<?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を作成してください。

[リスト2]firstslim/src/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の画面が表示されれば成功です。

図1:コンテナから取得したTwigを使って表示させた画面
図1:コンテナから取得したTwigを使って表示させた画面

 リスト2のコードは、前回記述したリスト4とほぼ同じコードです。違うのは、(1)の部分で、Twigクラスをnewする代わりにコンテナからTwigインスタンスを取得し、それを変数$viewとしています。

 この(1)のように、コンテナからインスタンスを取得するには、コールバック関数内で、以下の書式を記述します。

$this->get(インスタンスの識別文字列)

 ここで少し補足しておくと、このコールバック関数内に記述した$thisという変数は、コンテナそのものを指します。つまり、上の書式は、コンテナのメソッドget()を呼び出すことで、指定したインスタンスを取得していることになります。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きた...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:軽量PHPフレームワークSlimを習得しよう
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5