タイプセーフな汎用ログdecoratorを作成したいと思います。PHPの安全ジェネリックデコレータ
私はrepositories(インターフェース)の数を持って、そして、彼らは投げるかもしれない例外をキャッチLoggerInterfaceのインスタンスにそれらを渡した後、それらを再スローそれぞれのデコレータを必要としています。専用のデコレータを作成してそれぞれをテストすることは可能です(これはかなり面倒です(特にテストをうまくやっています)。
__call
を使用してより一般的なデコレータを作成することが、最初に考えられるアプローチです。しかし、これは、それが装飾するリポジトリインタフェースを実装していないオブジェクトインスタンスになります。それは私のプロジェクトにはありません。何らかの魔法を使うなど、このインターフェースを実装していることをPHPに伝える方法はありますか?reflection?
stackoverflowで「how to implement a decorator in PHP?」と「Best way to implement a decorator pattern for method result caching in PHP」と読みましたが、両方とも専用アプローチと汎用アプローチを説明していますが、どちらもタイプセーフな方法で汎用アプローチを示していません。これらの質問が投稿されてからしばらく時間がたっているので、状況が変わった可能性があります。私はPHP 7を使用しており、必要に応じてPHP 7.1を使用できます。
PHPUnit_MockObjectは、PHPUnitでおなじみのgetMock
メソッドによって呼び出されるのと同じコードを使用して、インターフェイスを実装するオブジェクトを構築することができます。これはジェネリックデコレータの基礎となりうる。しかし、それは生産コードで模擬ライブラリを使用する必要があります。さらに、このライブラリinternally uses evalはその仕事を終わらせる。これは私のプロジェクトでは不適格です。
神で例を参照してください、私はなぜあなたのためだけにロギングを行うカスタム例外ハンドラを作成していない私はここにPHPで – strangeqargo
を型安全性についての何かを見ることは決してないだろうと思いましたか?リポジトリから例外をキャッチする場合は、特別なRepositoryExceptionをスローするようにしてください(必要に応じてより詳細な例外を拡張することができます)。デコレータは、単純な問題に対するあまりにも複雑な解決策のようです。 – jfadich
興味深いことに、私はそれにもかかわらず、私が間違っていないと、リポジトリが使用されている場所で潜在的にキャッチするのではなく、例外が処理されずに泡立つようにする必要があります。その場合、例外ハンドラのアプローチは実行可能ではありません。 –