Skip to content

Instantly share code, notes, and snippets.

@asaokamei
Created June 19, 2015 00:53
Show Gist options
  • Save asaokamei/57312bea51af8837db8b to your computer and use it in GitHub Desktop.
Save asaokamei/57312bea51af8837db8b to your computer and use it in GitHub Desktop.
PSR-7用レスポンダー:Tuum/Respond(PHP)

Tuum/Respondの概要

開発中ですが、Tuum/Respondというパッケージを紹介してみます。

コツコツとフレームワークを自作してたのですが、本当に欲しいものはもっと簡単なことではないか?と考えなおして、機能を絞り込んで作りなおしたのがTuum/Respondです。

もともとはStackPHPをみて、簡潔なミドルウェア構造に憧れたところから始まりました。これを使って開発してみたい一方で、普通のウェブサイトを作るとなると、面倒な作業が多そうだなと。そこで不便な部分を解消したフレームワークを作ってたのですが、不便を解消する部分だけをパッケージにすることにしました。

概要

要するにPsr-7用オブジェクトのツールで、できるだけ簡潔にレスポンスを構築するための機能を持っています。

Psr7・ミドルウェアといった最近のマイクロ・フレームワークに「アドオン」のように導入でき、普通のウェブサイトの開発がしやすくなることが目的です。できるだけフレームワークに依存しない方針で開発してます。

Helpers

これは簡単な機能を提供します。例えば、

$bool = ResponseHelper::isRedirect($response);

はレスポンスがリダイレクトとかどうかを判定します。リクエストとレスポンス用のヘルパーがあります。

Responders

こちらがTuum/Respondのメインです。

テキスト、HTML、ダウンロードなど、様々な種類のレスポンスを構築するための機能があります。が、特別な機能としては、セッションのフラッシュ機能を使って、リクエスト間でデータを受け渡すことが出来ます。例えば、

$app = new App(); // 何かのマイクロフレームワーク

// ジャンプする
$app->get('/jumper', function($request) {
	return Respond::redirect($request, $response)
	    ->withMessage('bad input!') // <- メッセージなど設定
	    ->withInputData(['some' => 'value'])
	    ->withInputErrors(['some' => 'bad value'])
	    ->toPath('jump/to');
	});

// ...次のリクエスト
$app->get('/jumped', function($request) {
	return Respond::view($request, $response)
	    ->asView('template'); // with the 'welcome!' message.
});

としておいて、/jumperにアクセスします。すると/jumpにリダイレクトされますが、メッセージや入力データが「自動で」設定されます。ビューが対応していれば、自動で全て表示してくれる「はず」です。

どこかで見た機能とAPIですよね。Laravelいいですよね。

上の例では、redirectviewというレスポンダーを使いましたが、他にはerrorというのがあります。

Respond::error($request)->forbidden();

インストール

Tuum/Respondをインストールするには、gitを使って下さい。

git clone https://github.com/TuumPHP/Respond

サンプルのサイトがあります。PHPの内部サーバーを使えます。

$ cd Respond/public
$ php -S localhost:8888 index.php

Services

レスポンダーを使うにはPsr-7単体では必要な機能が足りません。そこでサービスとして機能を登録します。

SessionStorageInterface

Redirectレスポンダーを使うためには、セッションが必要です。

SessionStorageInterfaceを実装したオブジェクトを作成して、リクエストに設定します。実際はAura.Sessionをそのまま使えるので、そのコードを示します。

use Aura\Session\SessionFactory;

$factory = new SessionFactory();
$session = $factory->newInstance($_COOKIES);
$segment = $session->getSegment('some-name');

この$segmentがSessionStorageInterfaceと同じ(というか、これを参考にインターフェースを作ったのですが)なので。これを

use Tuum\Respond\RequestHelper;
$request = RequestHelper::withSessionMgr($request, $segment);

と設定します。

ViewStreamInterface

Viewレスポンダーを使うには、ViewStreamInterfaceを実装したオブジェクトを登録します。ビューとかテンプレートと呼ばれるやつですね。サンプルとして、Tuum/ViewとTuum/Formを使う方法を示します。

use Tuum\Respond\Service\ViewStream;
use Tuum\Respond\Service\ViewStreamInterface;

$request->withAttribute(ViewStreamInterface::class, ViewStream::forge(__DIR__.'/views'););

テンプレートのレンダラーはTwigでも何でも動くはずですが、肝心のメッセージなどのデータを処理できないと不便なので、結局はデフォルトで動かすことが多くなると思われます。

ErrorViewInterface

Errorレスポンダーを使うには、ErrorViewInterfaceを実装したオブジェクトを登録します。これも、サンプルとして例を示します。

$error = new ErrorView(ViewStream::forge(__DIR__ . '/error-view-dir'));
$error->default_error = 'errors/error';
$error->statusView = [
    Error::FILE_NOT_FOUND => 'errors/notFound',
];$request->withAttribute(ErrorViewInterface::class, $error);

ちなみに、ErrorViewはPHPのset_exception_handlerにも使えます。

set_exception_handler($error); // catch uncaught exception!!!

依存パッケージ

現状で、Tuum/Respondが利用するパッケージです。

必須のパッケージ。

  • Zendframework/Zend-Diactoros,
  • Container-interop/container-interop,

デフォルト実装として利用。

  • Aura/Session,
  • Tuum/View, and
  • Tuum/Form.

こちらは、インターフェースを介して実装を利用しているので、アダプターを使って別のパッケージに交換可能です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment