【问题标题】:What's the best design pattern for PHP when Class_a only occasionally needs Class_b information?当 Class_a 只是偶尔需要 Class_b 信息时,PHP 的最佳设计模式是什么?
【发布时间】:2010-07-17 18:10:30
【问题描述】:

这个项目是用 PHP 编写的,但与语言无关。我正在构建一个具有以下 MVC 格式的项目

Main_Class
Main_Class_Common
  --> Class_A
  --> Class_B
  --> Class_C
  --> Class_...
  --> Class_K

原始请求转到 Main_Class,然后包含适当的主子类。大多数请求只需要访问它自己的类中的数据。但是,有一小部分跨类数据。所有子类都需要随时访问 Main_Class_Common 中的共享通用函数。

例如,

Main_Class
Main_Class_Common
  --> Class_Projects
  --> Class_Clients

通常,Class_Projects 永远不需要来自 Class_Clients 的数据,除非在一个函数中它可能需要调用 $class_clients->get_client_details($client_id);,并且反过来偶尔也会发生同样的情况。

但是两个类都需要能够调用$main_class_common->clean_input($myinput);

目前,我正在使用Class class_a extends main_class_common() 访问完美运行的共享功能。但是是从 Class_A 访问 Class_B 以偶尔访问全局 $class_b 变量的最佳方式,还是应该将可能的共享函数移动到 Main_Class_Common 中,即使它们只是偶尔使用?

该项目目前处于开发的早期阶段,因此可以轻松更改当前的实现。

【问题讨论】:

  • Class_ProjectsClass_Clients的职责是什么?这些是 MVC 控制器、DAL/存储库类还是其他?
  • 目前,它们是通用类,包含与项目或客户端相关的所有功能,但它们的主要功能是作为 MVC 控制器。他们链接到一个完全独立的 DAL。 $class_clients->get_client_details 的示例函数构建查询并从 DAL 中获取特定记录。

标签: php language-agnostic design-patterns oop


【解决方案1】:

repository pattern 适合这里。创建Class_ProjectRepository类和Class_ClientRepository类,其中包含get_client_details($client_id)等方法。

MVC 控制器类将使用存储库。例如,Class_ProjectsClass_Clients 都可以使用Class_ClientRepository 来检索客户详细信息。

存储库类将构建查询并调用您的 DAL。此外,如果您在控制器中需要实际的域对象,例如 Class_Client,您还应该让存储库负责将 DAL 结果集转换为域对象。

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 2011-02-25
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多