MVC:更正来自不同模型的对象的模式

时间:2013-12-06 13:17:11

标签: cakephp design-patterns activerecord cakephp-2.0

我正在使用CakePHP2.3,我的应用程序在模型之间有很多关联。控制器动作通常涉及操纵来自另一个模型的数据,这是很常见的。所以我开始在模型类中编写一个方法来保持控制器的粗糙......但在这些情况下,我不确定该方法应该进入哪个模型?

这是一个例子。说我有两个模型:书和作者。作者有很多书。在/ books / add视图中,我可能希望显示一个热门作者的下拉列表,供用户选择与该书相关联。所以我需要在两个模型之一中编写一个方法。我应该......

一个。在Author模型类中编写一个方法,并从BooksController :: add()动作...

中调用该方法
$this->Author->get_popular_authors()

B中。在Book模型类中编写一个方法,该方法实例化另一个模型并使用它的查找函数......例如:

//Inside Book::get_popular_authors()
$Author = new Author();
$populars = $Author->find('all', $options);
return $populars;

我认为我的问题与“编写主要处理另一个模型之间关联的模型方法的最佳实践是什么?”相同。如何最好地确定该方法应属于哪种模型?提前谢谢。

PS:我对你是否认为CakePHP糟透或不是“真正的”MVC并不感兴趣。这个问题是关于MVC设计模式,而不是框架。

4 个答案:

答案 0 :(得分:6)

恕我直言,该功能应该在模型中,与您尝试检索的数据最匹配。模型是“数据层”。

因此,如果您要获取“热门作者”,则该函数应位于Author模型中,依此类推。

有时候一个函数不能“干净地”适合任何模型,所以你只需选择一个并继续。您需要关注更高效的设计决策。 :)


顺便说一句,在Cake中,可以访问相关模型而无需获取“其他”模型对象。因此,如果BookAuthor相关:

//BooksController
$this->Book->Author->get_popular_authors();

//Book Model
$this->Author->get_popular_authors();

参考:http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#relationship-types

答案 1 :(得分:2)

遵循编码标准:get_popular_authors()这应该是驼峰式的getPopularAuthors()。

我的猜测是你想要显示一个受欢迎的作者列表。我将使用一个元素来实现它并缓存该元素并使用requestAction()获取该元素中的数据以从Authors控制器获取数据(该操作调用模型方法)。

这样代码就在“正确”的位置,你的元素被缓存(性能奖励)并且可以在任何地方重复使用。

这让我回到了

  

“主要编写模型方法的最佳实践是什么?   处理另一个模型之间的关联?“

理论上,您可以将代码填充到任何模型中,并通过assoc调用它。我会说常识适用于此:您的方法应该在最匹配的模型/控制器中实现。它与用户有关吗?用户模型/控制器。它是属于用户的书吗?书籍型号/控制器。

我总是试图保持低耦合并将代码放入特定域。另请参阅separation of concerns

答案 2 :(得分:1)

我认为回答你问题的关键点在于你的规范:“......用户选择与该书相关的流行作者。”。

那,除了你取得所有作者的事实,让我问: 您将使用哪些标准来确定哪些作者受欢迎?

我对此表示怀疑,但如果这取决于当前正在添加的书籍,或者用户输入的某些先前字段,则采用解决方案B并在Book模型中编写逻辑有一定意义。

更可能的解决方案A是正确的解决方案,因为您的案例需要代码才能在Book控制器的添加操作中查找热门作者。它只是添加操作的“功能”,因此它应该在Author模型中编码以检索列表,并在准备“空”表单时将添加操作调用以将列表传递给视图。

此外,如果您愿意,可以在Book模型中编写一些类似的代码,例如,显示来自同一作者的所有其他书籍。

在这种情况下,您似乎想要受欢迎的作者(那些有更多书籍的人?),所以这显然是作者模型的“额外功能”(您甚至可以将其编码为自定义查找方法)。

在任何情况下,如其他人所述,不需要重新加载作者模型,因为它是通过与图书的关联自动加载的。

答案 3 :(得分:0)

留意过早优化。只需构建您的项目,直到它工作。在查看代码后,您始终可以优化代码或mvc模式。最重要的是,在您的项目完成后,您将看到更清晰或更好的方式,比以前更快,更智能,更好地完成项目。

你不能也永远不会一次建立一个完美的mvc或项目。您需要找到一种让您喜欢或喜欢的工作方式,并及时学习如何改进您的编码。

See for more information about Premature Optimization