異なる依存関係に必要な同じ機能を提供する2つのコンポーネント


9

Zend Framework 1とDoctrine2をORMレイヤーとして使用して、PHPでアプリケーションを構築しています。すべて順調です。さて、私はたまたまZF1とDoctrine2の両方が独自のキャッシング実装に付属していて、それに依存していることに気付きました。私は両方を評価しましたが、それぞれに独自の長所と短所がありますが、どちらも私の単純なニーズに対して他のものより優れているとは言えません。どちらのライブラリも、実装ではなく、それぞれのインターフェイスに対して作成されているようです。

これが問題であると感じる理由は、アプリケーションのブートストラップ中に、2つのキャッシュドライバーを構成する必要があることです。それぞれに独自の構文があります。この方法でミスマッチが簡単に作成され、このため、キャッシュバックエンドへの2つの接続を設定するのは非効率的です。

今後の最善の方法を決定するつもりであり、あなたが提供できるかもしれないあらゆる洞察を歓迎します。

これまでに考えたのは、4つのオプションです。

  1. 何もせず、キャッシング機能を提供する2つのクラスが存在することを受け入れます。
  2. ZendのインターフェースをDoctrineのキャッシング実装に固定するFacadeクラスを作成します。
  3. オプション2、その逆-Fendを作成して、DoctrineのインターフェースをZend Frameworkバックエンドにマッピングします。
  4. multiple-interface-inheritanceを使用して、すべてをルール化する1つのインターフェースを作成し、重複がないことを祈ります(つまり、両方に「save」メソッドがある場合、PHPのために同じ順序でパラメーターを受け入れる必要があります。適切な多型の欠如)。

どのオプションが最適ですか、または「上記のどれにも当てはまらない」のバリエーションがありません。


3
おそらく、PHP、ZF、またはDoctrineを知らない人のために、より一般的なソフトウェア設計の意味で問題を説明する必要があります。2つのライブラリは同じものをキャッシュしていますか?もしそうなら、なぜ1つのキャッシュを無効にしないのですか?そうでない場合、何が問題ですか?そういうこと。
idoby 2013

私は以前、独自のORMおよびデータベースアクセスキャッシュプロバイダーを備えた.NET CMSを使用していました。次に、CMSを、まったく異なるキャッシングプロバイダーを使用するビジネスプラットフォームと統合する必要がありました。ビジネスプラットフォームのキャッシュプロバイダーがスケールアウトできる場合、CMS内のキャッシュプロバイダーはWebファームにスケーラブルではないため、これにより問題が発生しました。あなたはどんな問題に直面していますか?
CodeART 2013

Symfony2と、この問題への取り組み方を見てください。
nietonfir 2013

回答:


7

何もしない個別のプロジェクトが独自のスペースで機能している限り(お互いのキャッシュを汚染していない限り)、個別のプロジェクトに冗長性を持たせることができます。DoctrineはZendにキャッシュがあることを知っていますが、Zendに依存したくないし、逆も同様です。すべての人がZendとDoctrineを使いたいわけではありません。

Doctrineのコードには独自のものを使用させ、他のすべてにはZFを使用させます。この方法では、ZFクラスを知るだけで済みます。Doctrineキャッシュは、Doctrineがデータベースオブジェクトに対して内部的にのみ使用する必要があります。ZFには、htmlページキャッシングフロントエンドのように、ORMの外部で役立つフロントエンドがあります。

別のレイヤーを作成するのが理想的ですが、プロジェクトに別の依存関係が追加されるため、メンテナンスにはあまり適していません。

ブートストラップでは、複数のキャッシュを設定することは冗長に見えることがあります。ZF1、Doctrine、ZF2を同時に使用しようとするとさらに悪化する可能性があります。しかし、変数を設定するだけで、バックエンドにはまだ接続していないため、非常に短い一定の時間です。

したがって、プログラミング、保守、運用の観点からは、それらをそのままにしておきます。


3

これが問題であると感じる理由は、アプリケーションのブートストラップ中に、2つのキャッシュドライバーを構成する必要があることです。それぞれに独自の構文があります。この方法ミスマッチが簡単に作成され、このため、キャッシュバックエンドへの2つの接続を設定するのは非効率的です。

「構成をより便利にする」という観点から問題に取り組むだけではどうですか。

つまり、構成データを受け入れる新しいクラスを作成し、それを両方のキャッシングドライバーに適用します。確かに、それはそれほど柔軟ではありませんが、それはまた、失敗が少なくなることを意味します。


0

各フレームワークに特化できるインターフェースの抽象化を作成してみませんか?両方のキャッシュをカプセル化する必要なメソッドを使用して、独自のキャッシュコントローラーを作成します。その後、私はそれらについて忘れて、私のコントローラーとのみ話すことができます。その解決策に問題がありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.