我想知道CakePHP的控制器是否不应该包含任何不能被URL访问的私有函数。
有时,有些函数,如、add、或、delete、会非常大,所以我更喜欢将它们分开。我应该把这个函数放在模型中而不是让控制器私有吗?
谢谢。
发布于 2012-09-21 16:50:08
是的,如果你把你的方法保留在模型里,那可能是最好的。就像你自己在评论中提到的那样,“让模型变胖,让控制器变细”。控制器只是一种媒介,应该是模型和视图之间的交互。
当您必须处理数据源、表中的更改时,问题就出现了。如果您的控制器是胖的,那么您将在任何地方使用字段,现在您将在不应该在的地方清理整个设置。
模型中的方法的另一个好处是,您可以从其他模型调用它,然后重用代码。例如:
class User extends AppModel {
public function getAllActiveUsers() {
// return active users
}
} 模型和控制器中的每一种方法都可以访问上述方法,这与用户有关。
如果您在其他地方需要这样的函数,并且没有在用户模型中定义它们,那么您将最终将其重定向到控制器,或者重新编写整个逻辑。
重定向并没有那么糟糕,但是考虑一下如果您在其他地方重写了逻辑,那么ActiveUsers的实现会发生什么变化。你最终将不得不在任何地方纠正事情。
然而,有一些事情必须在控制器中完成。例如,如果我必须计算用户的地理位置与所有匹配的餐厅之间的距离,以获得附近的距离,我应该在控制器中这样做。但是,为了最好的利益,控制器是薄薄的,并且为此目的存在组件。您可以为复杂而冗长的逻辑创建自定义组件。
发布于 2012-09-21 18:18:56
我在模型中加入了低级函数。特别是如果该函数可以由多个控制器使用。我所说的“低水平”是指尽可能接近模型数据。如果要对数据进行特定于视图的修改,或者将其与来自其他模型的数据(相关模型是一个例外)结合起来,则该函数不属于该模型。
另外,您可以在任何控制器函数的前缀加上下划线,它将无法通过url获得。
发布于 2012-09-21 21:00:35
处理从数据库中添加和删除条目的逻辑是域业务逻辑的一部分。这种方法应该是模型层的一部分。
由于CakePHP的实现非常有限(它假装模型层是活动记录实例的集合),您可以将这些方法移到某种类型的帮助程序中,或者使用单独的“模型”,这些模型不从AppModel继承。相反,这样的结构可以像服务一样工作,从而将控制器(和表示层作为整体)与域业务逻辑隔离开来。
https://stackoverflow.com/questions/12533640
复制相似问题