2

モデルに対して有効であるためには、すべてのストレージをサブスクライブする必要があるという契約「ArticleStorage」があります。確かに、これは問題ではありません。私の問題は次のとおりです。ページネーション...または「結果の変更」、この場合はfetchAllで、その動作を変更したいが、パラメータなどを追加せずに

<?php

interface ArticleStorage
{
    // public function insert();
    // public function update();
    // public function delete();
    public function fetchAll();
}

class MySQLArticleStorage implements ArticleStorage
{
    public function fetchAll()
    {
        // SELECT * FROM `articles`;
    }
}

?>

私のモデルの仕組み。

class ArticlesModel
{
    public function __construct(ArticleStorage $storage)
    {

    }
}

この場合、「ArticleStorage」を期待していますが、どの「Storage」が指定されているかわかりません。本当です...そして、ストレージを使用して、ページネーションまたは結果の変更を適用したいと考えています。

class MySQLArticleResultsModifier
{
    public function __construct(MySQLArticleStorage $storage)
    {

    }
    public function fetchAll() 
    {
        // ...
    }
}

ページネーションの場合、どのように ArticleStorage fetchAll を変更し、変更したクエリを適用できますか?

4

1 に答える 1

0

モデルが、別の fetchall の上に fetchall が可能であることを要求する場合がありますか? 私はそうは思いません。実際、この質問に答えることで、デコレータが必要かどうかを判断できます。

  • あなたが作ろうと考えているデコレーター関数は、クリスマス ツリー {decoration1} に星を配置し、同時にツリー {decoration2} にいくつかのおもちゃを配置できる、実際の装飾のようなものですか? そうでなければ、デコレータ パターンを作成しても意味がありません。デコレータの性質は、具体的なインスタンスに適用される他の装飾の影響を受けることなく、外部の世界から具体的な実装を装飾し、出力を変更することです。

現在の実装に関しては、@mrhobo はかなり正しいと思います。フェッチ関数は次のようになります。

public function fetch($limit, $order,$sort)

非常にスマートなフェッチでは、ユーザーが key-value 、 columnname = value of column のハッシュテーブルを送信することも期待できます。これを使用して、独自の選択クエリをその場で作成できます。

于 2013-08-23T06:36:28.783 に答える