【问题标题】:PHP + MVC - my domain model is confusedPHP + MVC - 我的域模型很困惑
【发布时间】:2012-05-07 02:07:09
【问题描述】:

我正在构建一个 Web 应用程序,该应用程序需要能够将数据写入 mysql db 或 xml 文件,具体取决于应用程序的在线状态。

在我的模型中,我有一个超类(Dao 是数据访问对象)...

 abstract class Dao {

    static function getInstance($online_status) {

        if $online_status = 'online' {

            return new DaoMySQL;

        } else {

            return new DaoXML;

        }

    }

    abstract function dao_select();
    abstract function dao_insert();
    abstract function dao_update();
    abstract function dao_delete();

}

现在,这是我感到困惑的部分。我有一个域模型/实体类,它使用以下方法选择适当的 Dao:

$this->dao = Dao::getInstance($online_status);

所以,现在我选择了正确的数据访问对象。但是,问题是我仍然是 dao_select() 和其他函数的两个实现。现在,主要实现在各自的类 DaoMySQL 和 DaoXML 中,但是每个类中的 dao_select() 需要不同的东西。即 DaoMySQL 版本需要两个参数,$table 和 $where_statement。 DaoXML(我还没有实现)将需要元素名称,也许还有另一个参数,我不知道。

所以,在我的领域模型类中,调用后

$this->dao = Dao::getInstance($online_status);

这是我需要包含 dao_select() 的两个单独的本地实现(仅与域模型/实体类有关)的地方,还是这个错误?看起来我正在通过这样的方式消除流程中的优雅:

class EntityModel {

  $this->dao = Dao::getInstance($online_status);

  if($this->dao->type = 'mysql') {

    $result = $this->dao->dao_select($table, $where);

  } else {

    $result = $this->dao->dao_select($xml_params);

  }


} 

我觉得我正在摆脱系统的简单性...这种方法有意义吗,还是有更好的方法?

【问题讨论】:

    标签: php model-view-controller design-patterns


    【解决方案1】:

    你做错了。

    开头的几点说明:

    • 在 OOP 中,extends 语句表示 是一个关系。这意味着,虽然class Duck extends Bird 很好,但写class User extends Table
    • 在 MVC 中,模型不是类或类的实例。相反,它是一层应用程序,主要由两种类型的元素组成:
      1. 域对象:包含域业务规则和逻辑
      2. 数据访问结构:通常datamapper处理信息的存储和检索

    我会argue,模型层的第三个重要部分是服务。但是有关于它是模型的一部分还是高于模型的选项。

    目前您正在尝试做的是强制使用 ActiveRecord(这对于小事情来说很好,但随着项目的增长,它会成为架构的负担......这就是您现在所面临的)模式来处理动态数据来源。为此,您正在诉诸程序调用。

    无论如何,关键是您应该将您的DAO 实例注入您的域对象(您称之为“模型”)。您应该将 DAO 的创建留给单独的工厂实例,该实例负责初始化它们并为它们提供数据源(PDO 实例或文件路径)。这样,您不仅可以分离职责,还可以“即时”交换存储目标。

    要了解更多信息,您应该调查什么是 dependency injection。以下是一些可能有帮助的视频:

    【讨论】:

    • 感谢您的回复,但我对您的回答感到困惑。虽然我的模型肯定包含类,但它不是一个单一的类。上面的 Dao 类只是模型层的一个组件。正如你所说,我也有域对象,它整合了我的应用程序中所有主要参与者的属性和方法(即,一个从多个数据库表中提取信息并将它们映射到单个对象的传记类)。我有点明白你关于 Active Record 的观点,但我不认为我正在实施它。我不会像您在上面的示例中那样将我的数据库表包装到类中。
    猜你喜欢
    • 2011-04-11
    • 2020-08-17
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多