3

モデルに多くのプレゼンテーション ロジックがあるように見えるアプリケーションのポイントに到達しています。

<?php foreach ($this->users as $user): ?>
    <span class="phone">
        <?php echo $user->getPhoneNumberFormattedAsText(); ?>
    </span>
<?php endforeach; ?>

最初は、ビュー ヘルパーの必要性としてこれに取り組み始めました。

<span class="phone"><?php echo $this->userPhone($user->getPhone()); ?></span>

ただし、ファイル全体を占有する必要のない、特定のモデルに固有の小さなビュー ヘルパーがたくさんあるという問題に直面し始めました。このプレゼンテーション ロジックをグループ化して、モデルから除外できればよいのですが。これは、デコレータパターンが理にかなっている場合だと思います。

「デコレータ パターンは、既存のオブジェクトに動作を動的に追加できるようにする設計パターンです。」

オンラインでいくつかの例を見たことがありますが、実際の実用的なコードの例はありません。PHP アプリケーションでこのパターンをうまく使用できたかどうか、また、このパターンの PHP の例がどのようになるかを知りたいです。

4

3 に答える 3

2

PHP アプリケーションにデコレータ パターンを実装しました。基本的には、基本的なニーズを定義する xml 構成ファイルへのラッパー クラスです。簡単にするために、例としてピザを使用します。次に、各成分のクラスを作成し、それを他のクラスにラップします。最後に、各クラスの Prize メソッドを呼び出すと、すべての合計が得られます。

$order = new pizza($xml_file);
$order = new add_salami($order);
$order = new add_cheese($order);
$order = new add_tomato($order);   
$order = $order->prize();

すべての成分クラスで現在のオブジェクトへのポインターを維持する必要があります。php new 関数を呼び出すと、それを使用して現在のオブジェクトをバックアップできます。これは、(オブジェクトの) リンクされたリストに少し似ています。次に、最後のオブジェクトの Prize() メソッドを呼び出して、他のすべてのクラスをループできます。ただし、装飾するには、新しいクラスを追加する必要があります。$xml_file を開始値に置き換えることもできます。すべてのデコレータ クラスを 1 つのファイルにまとめました。デコレータ クラスは次のようになります。

class add_salami {

    protected $order;
    protected $prize;

    public function __construct ($order) {
        $this->order = $order;
        $this->prize = $order->getPrize();
    }

    public function getPrize() {
        return $this->prize + 10;
    }
}

私はこれらの小さなデコレータ クラスの多くを巨大なファイルに保存しています。

于 2012-06-27T20:12:33.057 に答える
0

Zend Framework はフォーム要素にデコレータ パターンを使用します。type="text" の入力要素があると想像してください。この要素をラベル、div、フィールドセットなどで「装飾」できます。

于 2012-06-27T18:39:44.573 に答える