Cakephp MVC:引用来自不同模型的对象的正确模式
我使用的是CakePHP2.3,我的应用程序在模型之间有很多关联。控制器操作通常会涉及到操纵来自另一个模型的数据。所以我开始在model类中编写一个方法来保持控制器的精简。。。但在这种情况下,我永远不确定该方法应该采用哪种模型 这里有一个例子。假设我有两个模型:书和作者。作者有许多书。在/books/add视图中,我可能希望显示一个流行作者的下拉列表,供用户选择与该书关联的作者。所以我需要在两个模型中的一个中编写一个方法。我应该 A.在Author模型类中编写一个方法,并从BookController::add()操作中调用该方法Cakephp MVC:引用来自不同模型的对象的正确模式,cakephp,design-patterns,activerecord,cakephp-2.0,Cakephp,Design Patterns,Activerecord,Cakephp 2.0,我使用的是CakePHP2.3,我的应用程序在模型之间有很多关联。控制器操作通常会涉及到操纵来自另一个模型的数据。所以我开始在model类中编写一个方法来保持控制器的精简。。。但在这种情况下,我永远不确定该方法应该采用哪种模型 这里有一个例子。假设我有两个模型:书和作者。作者有许多书。在/books/add视图中,我可能希望显示一个流行作者的下拉列表,供用户选择与该书关联的作者。所以我需要在两个模型中的一个中编写一个方法。我应该 A.在Author模型类中编写一个方法,并从BookControl
$this->Author->get_popular_authors()
在BookModel类中编写一个方法,实例化另一个模型并使用它的find函数。。。例:
//Inside Book::get_popular_authors()
$Author = new Author();
$populars = $Author->find('all', $options);
return $populars;
我认为我的问题与问“编写主要处理另一个模型之间关联的模型方法的最佳实践是什么?”一样,如何最好地确定该方法应该属于哪个模型?提前谢谢
附言:我不想听到你认为CakePHP很差劲还是不是“真正的”MVC。这个问题是关于MVC设计模式,而不是框架。遵循编码标准:get\u popular\u authors()这应该是驼峰式的getPopularAuthors() 我的猜测是,您希望显示流行作者的列表。我将使用一个元素实现这一点,缓存该元素,并使用requestAction()从Authors控制器获取数据(该操作调用model方法)获取该元素中的数据 通过这种方式,代码位于“正确”的位置,您的元素被缓存(性能奖励)并可在任何位置重用 这让我想起了 “编写模型方法的最佳实践是什么 处理其他模型之间的关联?” 理论上,您可以将代码塞入任何模型中,并通过ASSOC调用它。我想说常识适用于这里:您的方法应该在它最匹配的模型/控制器中实现。它与用户相关吗?用户模型/控制器。它是属于用户的书吗?预订型号/控制器
我总是尽量保持低耦合,并将代码放入特定的域中。另请参见。IMHO函数应位于与您试图检索的数据最匹配的模型中。模型是“数据层” 因此,如果要获取“流行作者”,函数应该位于
Author
模型中,依此类推
有时一个函数“干净”地不适合任何模型,所以您只需选择一个并继续。您需要关注的设计决策更有效率。:)
顺便说一句,在Cake中,可以访问相关的模型,而无需获取模型对象的“其他”。因此,如果
书籍
与作者
相关:
//BooksController
$this->Book->Author->get_popular_authors();
//Book Model
$this->Author->get_popular_authors();
参考:我认为回答您问题的关键点是由您的规范定义的:“……供用户选择与该书相关的流行作者。” 除了你把所有的作者都找来之外,我还要问: 您将使用什么标准来确定哪些作者受欢迎 我对此表示怀疑,但如果这取决于正在添加的当前图书,或者用户输入的一些以前的字段,那么采用解决方案B并在图书模型中编写逻辑是有一定意义的 更可能的解决方案A是正确的解决方案,因为您的案例只需要在Book controller的add操作中找到流行作者的代码。它只是add操作的一个“特性”,因此应该在Author模型中对其进行编码以检索列表,并在准备“空”表单以将列表传递给视图时由add操作调用 此外,如果您想显示来自同一作者的所有其他书籍,那么在图书模型中编写一些类似的代码是有意义的 在这种情况下,您似乎想要受欢迎的作者(那些拥有更多书籍的人?),因此这显然是作者模型的“额外功能”(您甚至可以将其编码为自定义查找方法)
在任何情况下,正如其他人所说,无需重新加载作者模型,因为它是通过与书籍的关联自动加载的。注意过早优化。只要建立你的项目,直到它工作。在检查代码之后,您总是可以优化代码或mvc模式。最重要的是,在你的项目大部分时间完成后,你会看到一种更清晰或更好的方式,比以前更快/更聪明、更好地完成它 你不能也永远不会在同一时间构建一个完美的mvc或项目。您需要找到一种自己喜欢或喜欢的工作方式,最终您将学会如何改进编码
谢谢你的回答。我从问题中删除了有关加载关联模型的部分。为了确保我理解您的答案:您是说将方法放在模型中,使其与从DB访问的对象最匹配(例如:作者)?与大多数访问(书籍)的模式相反。我之所以这样问是因为在大多数情况下,所讨论的方法几乎总是从另一个模型的控制器调用的。这让我有点不清楚哪个模型/控制器最适合它。如果不知道整个方法,很难更清楚地回答这个问题。但是,我个人至少会把代码放在它最匹配的上下文中。如果您只是懒惰,您可以在另一个模型中添加一个包装器方法来缩短“路由”,或者在控制器操作中需要它的地方使用loadModel()。无论如何,模型都是延迟加载的,所以这应该不会有任何负面影响。我想我理解你的意思,但我仍然不太清楚你用来确定“匹配”的标准。我想你的