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”,真的……我想使用 Storage 进行分页或应用结果修改。

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

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

在分页的情况下,我如何修改 ArticleStorage fetchAll 并应用我修改后的查询?

4

1 回答 1

0

是否存在您的模型要求可以在另一个 fetchall 之上进行 fetchall 的情况?我不这么认为,事实上这就是你决定是否需要装饰器的方式,通过自己回答这个问题

  • 您正在考虑制作的装饰器功能是否像装饰品一样{就像真正的装饰品一样,您可以在圣诞树上放星星{decoration1},同时在树上放一些玩具{decoration2}?否则,制作装饰器模式毫无意义,装饰器的本质是从外部装饰具体实现,并更改输出,而不受应用于具体实例的其他装饰的影响。

现在关于当前的实现,我认为@mrhobo 是非常正确的,你的 fetch 函数可能看起来像

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

一个非常智能的获取还可以期望用户发送一个键值哈希表,列名 = 列的值,您可以使用它即时进行自己的选择查询。

于 2013-08-23T06:36:28.783 回答