Zend_Filter_Inflector(日本語)Zend_Filter_Inflector は、指定したターゲットに対して ルールにもとづいた文字列変換を行うための汎用的なツールです。 たとえば、MixedCase あるいは camelCase 形式の単語をパス形式に変換したりするような作業を行います。 読みやすさや OS のポリシーなどの理由で、小文字への変換を行ったりダッシュ ('-') で単語を区切ったりといったこともあるでしょう。 インフレクタは、このような作業を行うことができます。 Zend_Filter_Inflector は Zend_Filter_Interface を実装しています。 インフレクションを実行するには、オブジェクトのインスタンスで filter() をコールします。 Example #1 MixedCase あるいは camelCase のテキストを別形式に変換する
操作インフレクタには、ひとつの ターゲット とひとつあるいは複数の ルール が必要です。 ターゲットは基本的に文字列であり、置き換えを行うプレースホルダを定義します。 プレースホルダは、先頭に ':' をつけて :script のように定義します。 filter() をコールするときに、 ターゲット内の変数に対応するキーと値のペアを配列で渡します。 ターゲット内の個々の変数に対して、ゼロ個以上のルールを関連づけることができます。 ルールとして指定できるのは、静的な ルールか Zend_Filter クラスです。静的なルールは、 指定されたテキストで置き換えを行います。 それ以外の場合は、ルールで指定されたクラスを使用してテキストを変換します。 クラスを指定する際には、共通のプレフィックスを除いた短いクラス名を使用します。 たとえば Zend_Filter の具象実装クラスなら何でも使用可能です。 しかし、これを使用する際には 'Zend_Filter_Alpha' あるいは 'Zend_Filter_StringToLower' とするのではなく単に 'Alpha' あるいは 'StringToLower' だけで指定するということです。 その他のフィルタ向けのパスの設定Zend_Filter_Inflector は、 Zend_Loader_PluginLoader を使用してインフレクションに使用するフィルタの読み込みを行います。 デフォルトでは、 Zend_Filter で始まる任意のフィルタを使用できます。 このプレフィックスで始まるけれどももっと深い階層にあるフィルタ、たとえば Word 系のフィルタなどを使用したい場合は、プレフィックス Zend_Filter を除いた名前を指定します。
別のパスを使用するには、プラグインローダへのプロキシとして Zend_Filter_Inflector のユーティリティメソッド addFilterPrefixPath() を使用します。
あるいは、プラグインローダをインフレクタから取得して、 それを直接操作することもできます。
フィルタのパスを変更するための詳細なオプションは、PluginLoader のドキュメント を参照ください。 インフレクタのターゲットの設定インフレクタのターゲットは、変数用のプレースホルダを含む文字列となります。 プレースホルダは、先頭に識別子をつけて表します。 デフォルトの識別子はコロン (':') です。 そしてその後に変数名を続け、たとえば ':script' や ':path' のようになります。 filter() メソッドは、識別子の後に続く変数を探して置換します。 識別子を変更するには setTargetReplacementIdentifier() メソッドを使用するか、 コンストラクタの 3 番目の引数で指定します。
普通はコンストラクタでターゲットを指定することになるでしょう。 しかし、あとでターゲットを設定しなおしたくなることもあるかもしれません (たとえば、 ViewRenderer や Zend_Layout といったコアコンポーネントのデフォルトのインフレクタを変更したい場合など)。 この際に使用できるのが setTarget() です。
さらに、クラスのメンバーを用意して インフレクタのターゲットを変更できるようにしたくなるかもしれません。 毎回直接ターゲットを変更する必要がなくなる (メソッドコールを少なくできる) からです。 そのためには setTargetReference() を使用します。
インフレクションのルール先ほど説明したように、静的なルールとフィルタを使用したルールのふたつがあります。
静的なルール静的なルールは、単なる文字列の置換を行います。 これは、ターゲットの中の、 ほぼ固定であるが開発者が変更できるようにさせたい部分などに使用します。 setStaticRule() メソッドを使用して、ルールの設定や変更を行います。
ターゲットと同様、静的ルールも参照で指定できます。 これにより、メソッドコールをせずに変数を更新するだけでルールを変更できるようになります。 これは、クラスの中で内部的にインフレクタを使用している場合に便利です。 ユーザにいちいちインフレクタを取得させる必要がなくなります。 これを実現するために使用するのが setStaticRuleReference() メソッドです。
Filter Inflector ルールZend_Filter のフィルタ群も、インフレクタのルールとして使用できます。 静的なルールと同様、こちらもターゲットの変数にバインドされます。 静的なルールとは異なり、複数のフィルタによるインフレクションを行うこともあります。 これらのフィルタは順番に処理されるので、 最終的にほしいデータを考慮してフィルタの登録順を決めるようにしましょう。 ルールを追加するには、 setFilterRule() (その変数に対する既存のルールをすべて上書きします) あるいは addFilterRule() (その変数に対する既存のルールを保持し、 新たなルールを最後に追加します) を使用します。 フィルタは、以下のいずれかの形式で指定します。
多くのルールを一度に設定する一般に、各変数に対して個別にインフレクタルールを設定するよりも、 一括してルールを設定できたほうが楽でしょう。 Zend_Filter_Inflector の addRules() メソッドや setRules() メソッドを使用すると、 一括設定できます。 それぞれのメソッドには、変数とルールのペアの配列を指定します。 ルールには、(文字列、フィルタオブジェクトあるいはその配列などの) いずれの形式でも指定できます。変数名には特別な記法を用い、 それによって静的ルールとフィルタルールを切り替えます。 使用する記法は次のとおりです。
Example #2 複数のルールの一括設定
ユーティリティメソッドZend_Filter_Inflector のユーティリティメソッド群には、 プラグインローダーの取得や設定、 ルールの操作や取得、 例外をスローするかどうかやその時期の設定といったことを行えるものがあります。
Zend_Filter_Inflector での Zend_Config の使用法Zend_Config を使用してルールを設定したり、 フィルタのプレフィックスのパスやその他のインフレクタの状態を設定できます。 そのためには、Zend_Config オブジェクトをコンストラクタあるいは setOptions() に渡します。 設定可能な項目は以下のとおりです。
Example #3 Zend_Filter_Inflector での Zend_Config の使用法
|