PHP マイクロフレームワーク Slim v4 のアルファ版が出ました!

実装の薄さで言えばトップクラスの PHP マイクロフレームワーク [Slim Framework](http://www.slimframework.com/) の最新メジャーバージョン、 v4 のアルファ版がリリースされていました。

v4 の作成中ドキュメントは現在[こちら](http://slim-website.lgse.com/docs/v4/)で閲覧出来ます(リリース後は URL 変わりそう)。

[リリースノートはこちら](https://github.com/slimphp/Slim/pull/2665)で、[フィードバックはこちら](https://github.com/slimphp/Slim/issues/2653)で受け付けているようです。

※ Slim Framework 自体についての紹介は省略します。

## v3 からどう変わった？

### PSR 準拠を進めた

#### PSR-7: HTTP Message Interface

PHP のスタンダードなインターフェース(~~なお Symfony/Laravel 系列を除く~~)として存在する PSR 準拠をデザインの主軸に置いている Slim ですが、 v3 では [PSR-7](https://www.php-fig.org/psr/psr-7/) である HTTP Message 部分を自前で実装して提供していました。

v4 からはその実装も [slim/psr7](https://github.com/slimphp/Slim-Psr7) の方に移動していて、ユ－ザが任意の PSR-7 実装を選択して使えるようになっています。

現在は公式として [Slim PSR-7](https://github.com/slimphp/Slim-Psr7), [Nyholm PSR-7](https://github.com/Nyholm/psr7), [Guzzle PSR-7](https://github.com/guzzle/psr7), [Zend Diactoros](https://github.com/zendframework/zend-diactoros) の四種類がサポートされています。インターフェースを実装することでその他の PSR-7 実装を利用することも可能です。

公式でサポートされている実装は, require するだけで自動的に存在するかどうかを判別してくれます。

#### PSR-11: Container Interface

[PSR-11 Container](https://www.php-fig.org/psr/psr-11/) は [Pimple](https://pimple.symfony.com/) がデフォルトでインストールされていました。

Pimple もまたマイクロな DI コンテナとなっていて、本当に「手動で登録して」「手動で取得する」しか出来ないシンプルなものでした。コンストラクタに型を記述しておけば自動で依存関係を解決してインスタンス化出来る AutoWiring 機能を持っているのが一般的な DI コンテナです。

この Pimple も依存関係から外れて、 DI コンテナ実装を自由に選べるようになりました。

#### PSR-15: HTTP Handlers

最もメインで破壊的な変更として、 [PSR-15 HTTP Handlers](https://www.php-fig.org/psr/psr-15) による HTTP ハンドリングを行う形式になったことが挙げられます。

PSR-15 を最速で実装して話題になったのは [Zend Expressive](https://docs.zendframework.com/zend-expressive/) ですが、それに追従する形となります。

これは PSR-7 の Request を受け取って、 Middleware を経由し、 Response を生成する、という一連の流れを定義したインターフェースです。

`Slim\App` メインクラスがこの `RequestHandlerInterface` を実装したものとなっています。

#### PSR-17: HTTP Factories

PSR-7 の Request や Response クラスをどう生成するのか定義した [PSR-17 HTTP Factories](https://www.php-fig.org/psr/psr-17) も利用されています。

### ルーティングの実装依存を弱めた

これまで通り [nikic/fast-route](https://github.com/nikic/FastRoute) を依存として明示されていて、これを利用したルーティングを実装していますが、インターフェ－スを経由してユーザが異なるルーティングライブラリを使うことも出来るようになりました。いよいよ何を実装しているのかわからないレベルです。

### エラーハンドリングを実装しやすくした

v3 で任意のエラーハンドリングを行う際は、コンテナの `errorHandler` キ－に関数を登録する形で、 403/404/PHP Error は別のキ－に登録する必要があるなどかなり分かりづらい形式でしたが、今回から `ErrorMiddleware` が実装され、ミドルウェアを通してハンドリングを調整出来るようになりました。

また、例外が `SlimException` ではなく `HttpException` となり、各種ステ－タスコ－ドごとのクラスに分けられたので、型を見て処理を分けることができるようになりまし。

### レスポンスの Emit をカスタマイズしやすくした

v3 では `Slim\App` クラス内でレスポンスを出力していましたが、任意の実装で出力出来るよう `Slim\EventEmitter` クラスに分割されました。

### 連想配列によるコンフィグをやめた

以前は謎の連想配列をコンフィグとして `Slim\App` クラスのコンストラクタに渡し挙動を変更していましたが、代わりにそれぞれの設定を複数の `Middleware` クラスのコンストラクタで明示的に指定するようになりました(エラ－を表示するかどうかなど)。

---

> 根本的に、 Slim は HTTP リクエストを受け取り、適切なコールバックルーチンを実行し、 HTTP レスポンスを返すだけの Dispatcher である

Slim のコアコンセプトとしてこのようなものが挙げられています。 PHP 利用者は HTTP プロトコルの処理を($_GET などを通して...)したいわけではなく、受け取ったリクエストを処理してレスポンスを生成したいだけです。

PHP 特有の HTTP プロトコル周りの難しい処理を Slim が全て行ってくれるので、 Slim の利用者は **実装したい処理だけ** を実装することができます。

個人的にはかなり,かなり良くなったと思います。

v3 までの実装だと,「小規模な実装であれば使えそうだけど,スケールしづらいなあ...」と思っていましたが,ここまで抽象化が進んでいれば **大規模な所までスケールして** いけるのではないかという期待があります。

DDD によるサンプル実装として [l0gicgate/Slim-Skeleton](https://github.com/l0gicgate/Slim-Skeleton/tree/4.x) が提供されています。これをみるとスケールも全然出来そうな可能性を感じます。

---

代わりに、 v3 との変更がかなり大きいため,バージョンアップはかなり厳しいのではないでしょうか。 v3 を使っている人はそのまま,これから新しくアプリケーションを構築する人は v4 を使っていくのが良いのではないでしょうか。これからの動向が楽しみですー。

## 参考資料

- [Slim 4 Alpha Release by l0gicgate · Pull Request #2665 · slimphp/Slim](https://github.com/slimphp/Slim/pull/2665)
- [Expressive - Zend Framework Docs](https://docs.zendframework.com/zend-expressive/)
- [slimphp/Slim at 4.x](https://github.com/slimphp/Slim/tree/4.x)
- [PHP Standards Recommendations - PHP-FIG](https://www.php-fig.org/psr/)