Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp MVC:引用来自不同模型的对象的正确模式_Cakephp_Design Patterns_Activerecord_Cakephp 2.0 - Fatal编程技术网

Cakephp MVC:引用来自不同模型的对象的正确模式

Cakephp MVC:引用来自不同模型的对象的正确模式,cakephp,design-patterns,activerecord,cakephp-2.0,Cakephp,Design Patterns,Activerecord,Cakephp 2.0,我使用的是CakePHP2.3,我的应用程序在模型之间有很多关联。控制器操作通常会涉及到操纵来自另一个模型的数据。所以我开始在model类中编写一个方法来保持控制器的精简。。。但在这种情况下,我永远不确定该方法应该采用哪种模型 这里有一个例子。假设我有两个模型:书和作者。作者有许多书。在/books/add视图中,我可能希望显示一个流行作者的下拉列表,供用户选择与该书关联的作者。所以我需要在两个模型中的一个中编写一个方法。我应该 A.在Author模型类中编写一个方法,并从BookControl

我使用的是CakePHP2.3,我的应用程序在模型之间有很多关联。控制器操作通常会涉及到操纵来自另一个模型的数据。所以我开始在model类中编写一个方法来保持控制器的精简。。。但在这种情况下,我永远不确定该方法应该采用哪种模型

这里有一个例子。假设我有两个模型:书和作者。作者有许多书。在/books/add视图中,我可能希望显示一个流行作者的下拉列表,供用户选择与该书关联的作者。所以我需要在两个模型中的一个中编写一个方法。我应该

A.在Author模型类中编写一个方法,并从BookController::add()操作中调用该方法

$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()。无论如何,模型都是延迟加载的,所以这应该不会有任何负面影响。我想我理解你的意思,但我仍然不太清楚你用来确定“匹配”的标准。我想你的