我正在使用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设计模式,而不是框架。答案 0 :(得分:6)
恕我直言,该功能应该在模型中,与您尝试检索的数据最匹配。模型是“数据层”。
因此,如果您要获取“热门作者”,则该函数应位于Author
模型中,依此类推。
有时候一个函数不能“干净地”适合任何模型,所以你只需选择一个并继续。您需要关注更高效的设计决策。 :)
Book
与Author
相关:
//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或项目。您需要找到一种让您喜欢或喜欢的工作方式,并及时学习如何改进您的编码。