2019の13日目の記事です。昨日はpolidogさんのhelicon/object-mapperを作ったでした。型情報と連想配列のマッピングまでできるというのはアツいですね。僕もライブラリ公開していきたい。ContainerのRay.Diを連携させる方法をご紹介します。僕はレガシーなフレームワークを使っている環境に関わっているのですが、いい加減このフレームワークへの依存を切り離し、コードを減らしていきたいと常々思っています。ある日、色々検討する過程で、「別のWAFでリクエストをハンドル・プロキシして古いコード動かせばよくね?」ということを思いつきました。ある世のフレームワークの中で、PSRに準拠しており、学習コストが低い(コードすぐ読める)Slimを実験で使うことにしました。該当のプロジェクトではコードの複雑な依存性を解消するために、DIコンテナとしてRay.Diを用いています。極論を言ってしまえば、SlimでRay.Diを使えれば大体もうなんでもできるんじゃないか、ということですね。Slimとは?SlimはPHPのマイクロフレームワークです。PSRに準拠した、ルーティングとDIを提供する小さなライブラリなので、フルスタックフレームワークのネットワーク系の処理の差し替えに向いていると思い検討に入れました。コード量が少なく、PSRに準拠した機構なので内容を把握しやすいです。これらはフレームワークのレールから外れた対応を行うので、コードを読んで中身を把握しやすいという観点も重要です。Ray.Diとは?Ray.DiはPHPのDIコンテナです。RESTFulアプリケーションのフレームワークであるBEAR.Sundayでも利用されています。(絶賛勉強中)JavaのGuiceを参考に作られており、細かな挙動調整ができて非常に便利です。アノテーションによるInjectionの制御やBindingの設定などの柔軟性が高く、既存の処理との兼ね合いを考慮した設定も可能なので、レガシーコードの改善で役立つシーンは多いと感じています。なにより、フレームワークライブラリが提供するDIではないため、今回のようなフレームワーク移管に関する取り回しがとても効きます。SlimとDI-ContainerSlimは独自でDI-Conatinerの仕組みを持っていますが、これもPSRに準拠しているため差し替えが用意です。ContainerSlimでDIを行う場合は以下のようにします。$response;});このとき、DIはPSR-11で定義されているContainerInterfaceを期待しています。Ray.DiをContainerInterfaceでラップしたクラスを定義してやれば違和感なく利用できます。Ray.Diのお手軽使い方Redisを使った簡単データストア例です。昨今ならFirebaseとか使えよ感。Interfaceを定義。$value);}本体を実装していきます。}}モジュール定義します。Ray.Di実際にRay.DiをSlimと連携させていきます。Containerのラッパーを作成PSR-11のContainerInterfaceを実装します。コンストラクタでAbstractModuleを受け取り、Injectorを作成します。hasについてはRay.DiにそれっぽいI/Fが無く、UnboundのExceptionが発行されるようなのでとりあえずTry-Catchします。}}Ray.Diのモジュールを作成モジュールをインストールするルートのModuleを定義します。ここはBEAR.Sundayを参考にしました。ここでモジュールを一覧できるようになります。}}Slimアプリの作成ContainerにAppModuleのインスタンスを渡して初期化したものを、AppFactoryに与えます。これにより、Slimの処理からDI-Containerを呼び出せるようになります。$res;});DI-Containerと連携するStoreInterfaceを元にモジュールをコールバックに注入する例です。Controllerとか作ってコンストラクタでインジェクションすることもできます。'application/json');});まとめ今回作成したコードはこちらにおいてあります。Containerを一段覆わないと行けない点はありますが、少ないコードで移植性の高い基盤が作れそうです。Slimは簡単にかけるフレームワークだなと思ってたんですが、基礎モジュールがPSRのInterface依存なので、非常に拡張しやすいですね。(昨今のフレームワークはだいたいそうかな?)Ray.Diも拡張性が高く、結合度の高いプロジェクトの中で部分的に疎結合な空間を作っていく際にとても役立ちます。密結合なレガシーコードの改善の参考になれたら嬉しいです。「専門家をもっと身近に」を理念として、人々と専門家をつなぐポータルサイト「弁護士ドットコム」「弁護士ドットコムニュース」「税理士ドットコム」を提供。upLoginユーザーは見つかりませんでした。