開発中ですが、Tuum/Respondというパッケージを紹介してみます。
コツコツとフレームワークを自作してたのですが、本当に欲しいものはもっと簡単なことではないか?と考えなおして、機能を絞り込んで作りなおしたのがTuum/Respondです。
もともとはStackPHPをみて、簡潔なミドルウェア構造に憧れたところから始まりました。これを使って開発してみたい一方で、普通のウェブサイトを作るとなると、面倒な作業が多そうだなと。そこで不便な部分を解消したフレームワークを作ってたのですが、不便を解消する部分だけをパッケージにすることにしました。
要するにPsr-7用オブジェクトのツールで、できるだけ簡潔にレスポンスを構築するための機能を持っています。
Psr7・ミドルウェアといった最近のマイクロ・フレームワークに「アドオン」のように導入でき、普通のウェブサイトの開発がしやすくなることが目的です。できるだけフレームワークに依存しない方針で開発してます。
これは簡単な機能を提供します。例えば、
$bool = ResponseHelper::isRedirect($response);
はレスポンスがリダイレクトとかどうかを判定します。リクエストとレスポンス用のヘルパーがあります。
こちらが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いいですよね。
上の例では、redirect
とview
というレスポンダーを使いましたが、他には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
レスポンダーを使うにはPsr-7単体では必要な機能が足りません。そこでサービスとして機能を登録します。
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);
と設定します。
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でも何でも動くはずですが、肝心のメッセージなどのデータを処理できないと不便なので、結局はデフォルトで動かすことが多くなると思われます。
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.
こちらは、インターフェースを介して実装を利用しているので、アダプターを使って別のパッケージに交換可能です。