我使用CakePHP2.3,我的应用程序在模型之间有很多关联。控制器的操作通常会涉及到对来自另一个模型的数据进行操作。所以我开始在模型类中写一个方法来保持控制器的瘦。。。但在这种情况下,我永远不确定该方法应该采用哪种模型?
下面是一个例子。假设我有两个模型:Book和Author。作者有许多书。在/books/add视图中,我可能想显示一个流行作者的下拉列表,供用户选择与该书相关联的作者。所以我需要在这两个模型中的一个模型中编写一个方法。我应该…吗
A。在Author模型类中编写一个方法,并从BooksController::add()操作内部调用该方法。。。
$this->Author->get_popular_authors()
B。在Book模型类中编写一个方法,该方法实例化另一个模型并使用它的find函数。。。例如:
//Inside Book::get_popular_authors()
$Author = new Author();
$populars = $Author->find('all', $options);
return $populars;
我认为我的问题与问"编写主要处理另一个模型之间关联的模型方法的最佳实践是什么?"如何最好地决定该方法应该属于哪个模型?提前谢谢。
附言:我不感兴趣听你认为CakePHP是烂的还是不是"真正的"MVC。这个问题是关于MVC设计模式,而不是框架。
IMHO函数应该在与您试图检索的数据最匹配的模型中。模型是"数据层"。
因此,如果您正在获取"流行作者",则函数应该在Author
模型中,依此类推
有时一个函数不能"干净"地适应任何模型,所以您只需选择一个并继续。还有更多富有成效的设计决策值得您关注。:)
顺便说一句,在Cake中,可以访问相关的模型,而无需获取"其他"模型对象。因此,如果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-类型
遵循编码标准:get_popular_authors()这应该是驼色大小写的getPopularAuthors()。
我的猜测是,你想显示一个受欢迎的作者列表。我将使用一个元素来实现这一点,并缓存该元素,并使用requestAction()从Authors控制器获取该元素中的数据(该操作调用模型方法)。
通过这种方式,代码位于"正确"的位置,您的元素被缓存(性能奖励),并可在任何位置重复使用。
这让我回到
"编写模型方法的最佳实践是什么处理另一个模型之间的关联?"
理论上,您可以将代码插入任何模型中,并通过assoc进行调用。我想说,常识适用于此:您的方法应该在最匹配的模型/控制器中实现。它与用户有关吗?用户模型/控制器。这是一本属于用户的书吗?书本型号/控制器。
我总是尽量保持低耦合,并将代码放入特定的域中。另见关注点的分离。
我认为回答您的问题的关键点是由您的规范定义的:"……用户可以选择与该书相关的流行作者。"。
除了你能找到所有的作者之外,我还想问:你将使用什么标准来确定哪些作者受欢迎?
我对此表示怀疑,但如果这取决于添加的当前书籍,或者用户之前输入的一些字段,那么采用解决方案B并在书籍模型中编写逻辑是有意义的。
更可能的解决方案A是正确的解决方案,因为您的案例只需要在Book控制器的添加操作中找到受欢迎的作者的代码。它只是添加操作的一个"功能",因此它应该在Author模型中进行编码以检索列表,并在准备将列表传递给视图的"空"表单时由添加操作调用。
此外,如果你想显示同一作者的所有其他书籍,那么在Book模型中编写一些类似的代码是有意义的。
在这种情况下,你似乎想要受欢迎的作者(那些有更多书的作者?),所以这显然是作者模型的"额外功能"(你甚至可以将其编码为自定义查找方法)。
无论如何,正如其他人所说,没有必要重新加载Author模型,因为它是通过与Books的关联自动加载的。
注意过早优化。只要构建你的项目,直到它发挥作用。在对代码进行审查后,您总是可以优化代码或mvc模式。最重要的是,在你的项目完成后,大多数时候你会看到一种更清晰或更好的方法,比以前更快/更聪明、更好地完成它。
你不可能也永远不会在一次内构建一个完美的mvc或项目。你需要找到一种你喜欢或喜欢的工作方式,随着时间的推移,你会学会如何改进你的编码。
有关过早优化的更多信息,请参阅