SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

 コンテナの解説に入る前に、まず前回紹介した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()を呼び出すことで、指定したインスタンスを取得していることになります。

次のページ
コンテナの仕組みに関する少し難しい話

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
軽量PHPフレームワークSlimを習得しよう連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11617 2019/07/11 11:22

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング