プラグインのロードZend Framework の多くのコンポーネントはプラグイン方式を採用しており、 クラスのプレフィックスとクラスファイルへのパスを指定して動的に機能を読み込むことができます。 このファイルは include_path にある必要がなく、 また標準の命名規約に従っている必要もありません。 Zend_Loader_PluginLoader は、この処理のための共通機能を提供します。 PluginLoader の基本的な使用法は Zend Framework の命名規約に従った形式です。各クラスを個別のファイルに分けて、 アンダースコアをディレクトリ区切り文字としてパスを解決します。 オプションのクラスプレフィックスを指定して、 特定のプラグインクラスをロードする際の先頭にそれを付加できます。 また、パスの検索は LIFO (後入れ先出し) 方式で行います。 LIFO 方式の検索とクラスプレフィックスを用いることで、 プラグインに独自の名前空間を指定できます。 そして、事前に登録されているプラグインを上書きできるようになります。 基本的な使用例次のようなディレクトリ構造とクラスファイル群の構成を考えてみましょう。 トップディレクトリと library ディレクトリは include_path に含まれているものとします。
では、プラグインローダーを作成してビューヘルパー群の場所を指定しましょう。
こうしておけば、クラス名のプレフィックスを除いた部分を指定するだけで ビューヘルパーをロードできるようになります。
クラスを読み込めたら、次はそのインスタンスを作成します。
Zend_Loader_PluginLoader には、 複数のプラグインの間でオブジェクトを共有する機能もあります。 その際にシングルトンインスタンスを作成する必要はありません。 この機能は、静的レジストリを用いて実現しています。 インスタンスを作成する際に、 コンストラクタの 2 番目のパラメータでレジストリを指定します。
PluginLoader がインスタンス化したその他のコンポーネントで このレジストリ名を使用すると、すでに読み込まれているパスやプラグインを使用できます。 プラグインのパスの操作先ほどのセクションの例では、プラグインローダーでパスを追加する方法を示しました。 では、すでに読み込まれているパスを調べたりそれを削除したりしたい場合は、 いったいどうすればいいのでしょうか?
プラグインの確認とクラス名の取得時には、プラグインクラスがロードされているかどうかを調べてから何かを行いたいこともあるでしょう。 isLoaded() は、プラグイン名を受け取ってその状態を返します。 PluginLoader の使用法としてもうひとつよくあるのが、 読み込まれているクラスの完全なクラス名を調べることです。 getClassName() がこの機能を実現しています。 一般に、これは isLoaded() と組み合わせて使用します。
プラグインのパフォーマンスの向上プラグインの読み込みは、非常に重い操作となりえます。 まず各プレフィックスについてループ処理をする必要があり、 各プレフィックス上のパスをすべて調べ、 期待通りのクラスに対応するファイルを探すという操作になるからです。 ファイルは存在するもののそこでクラスが定義されていないといった場合は PHP のエラースタックにエラーが追加されますが、 これもまた負荷のかかる操作です。 ここで問題となるのが「プラグイン機能の柔軟性を保ちつつ パフォーマンスも向上させるにはどうすればいいか?」ということです。 Zend_Loader_PluginLoader では、このような場合のためのオプトイン機能として ファイルインクルードキャッシュを提供しています。 これを有効にすると、インクルードに成功したすべてのファイルを含む 単一のファイルを作成します。起動ファイルからこれをコールできます。 この方式を使用すると、実運用サーバ上でのパフォーマンスが劇的に向上します。 Example #1 PluginLoader クラスのファイルインクルードキャッシュの使用法 クラスファイルのインクルードキャッシュを使用するには、 次のコードを起動ファイルに追加します。
もちろん、パスやファイル名は必要に応じて変更することになります。 このコードはできるだけ早い段階で実行されるようにしなければなりません。 そうすることで、プラグイン機構をもつコンポーネントが確実にキャッシュを使用できるようにします。 開発段階ではキャッシュを無効にしたいこともあるでしょう。 その方法のひとつとしては、ある設定項目を切り替えることで プラグインローダーがキャッシュするかしないかを指定するというものがあります。
これを使えば、コードを直接変更しなくても設定ファイルだけの変更だけですませることができます。
|
|