【问题标题】:In Modular Codeigniter, how can/should one module's controller call another module's function?在模块化 Codeigniter 中,一个模块的控制器如何/应该如何调用另一个模块的功能?
【发布时间】:2012-09-09 02:39:53
【问题描述】:

我正在使用 CodeIgniter 和 wiredesignz 的 HMVC 扩展。

我的网络应用主要处理文本文章。我有一个名为articles 的模块。文章模块的模型articles_model 包含对文章进行数据库更改的函数。例如,以下内容将更新文章:

$this->articles_model->update_article();

用户仪表板还有另一个模块。用户有时会从他们的仪表板中更新文章。该请求是从仪表板控制器发出的,因为此操作是从仪表板模块中的视图执行的。

在这种情况下,我应该如何让仪表板控制器与文章模型进行通信?到目前为止,我遇到的几个选项是:

  1. 在文章控制器中创建一个update_article() 函数。它所做的只是调用同名的articles_model 函数。让仪表板控制器调用文章控制器函数update_article()。之所以会这样做,是因为我已经读过在模块化设计中,控制器应该是不同模块之间的通信点 (source)。我还遇到过其他观点,即控制器永远不应该互相交谈。因此我很困惑。

  2. 我还可以在dashboard_model 中复制update_article() 函数。这样,仪表板控制器只需在自己的模块中调用自己的模型。我的直觉告诉我这不是要走的路,因为update_article() 函数不仅被仪表板控制器调用,而且还有很多其他函数。这会导致大量重复代码。

感谢任何建议。

【问题讨论】:

  • 您描述的设置似乎有点混乱,但DRY 绝对适用于此。由于设计限制导致的重复代码是一种严重的设计气味。
  • 设置基本上归结为 2 个模块,每个模块代表系统中的一个实体(文章和用户仪表板)。我如何让他们交流?

标签: php codeigniter module codeigniter-2 hmvc


【解决方案1】:

您可以从模块 articles 从另一个模块 Dashboard 加载模型 articles

只需在您希望模型可用的模块的构造函数中加载模型(例如Dashboard),应该如下所示。

function __construct() {
  parent::__construct();

  ...

  // this is case sensitive, 1st part is the module, 2nd part is the class name
  $this->load->model('articles/Articles');
}

然后在您的控制器中的任何位置(例如Dashboard),您都可以调用$this->articles_model->update_article();

【讨论】:

  • 这是我迄今为止所做的,只是为了让事情顺利进行。我想知道这是否符合 HMVC 设计的正确做法。
  • 是的,这确实符合 HVMC 设计。由于模型嵌套在它们自己的模块中,因此您需要访问不同的模块。
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 2013-05-29
  • 2012-10-13
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多