3

我想知道 CakePHP 的控制器是否不应该包含任何 URL 无法访问的私有函数。

有时某些函数(例如添加删除)可能太大了,以至于我更喜欢​​将它们分开。我应该将这些函数放在模型中,而不是在控制器上设为私有吗?

谢谢。

4

4 回答 4

4

是的,如果您将方法保留在模型中,这可能是最好的。就像您自己在评论中提到的那样,“保持模型胖而控制器瘦”。控制器只是模型和视图之间交互的媒介。

当您必须处理数据源、表中的更改时,问题就来了。如果你的控制器很胖,你会到处使用这些字段,现在你将不得不在不应该在的地方清理整个设置。

模型中方法的额外好处是您可以从其他模型中调用它并重用代码。例如:

class User extends AppModel {

     public function getAllActiveUsers() {
         // return active users
     }

} 

上述方法可以被模型和控制器中与用户相关的所有其他方法访问。

如果您在其他地方需要此类功能,并且没有在 User 模型中定义它们,您最终要么将其重定向到控制器,要么重新编写整个逻辑。

重定向的事情并没有那么糟糕,但考虑一下如果你在别处重写了逻辑,然后你的 ActiveUsers 的实现发生了变化会发生什么。您最终将不得不在任何地方纠正问题。

然而,有一些事情必须在控制器中完成。例如,如果我必须计算用户的地理位置与附近所有匹配餐厅之间的距离,我应该在控制器中执行此操作。但控制器保持精简符合最佳利益,并且为此目的存在组件。您可以为复杂而冗长的逻辑创建自定义组件。

于 2012-09-21T16:50:08.533 回答
1

我在模型中放置了较低级别的功能。特别是如果该功能可以由多个控制器使用。“低级”是指尽可能接近模型数据。如果您要对数据进行特定于视图的修改或将其与来自其他模型的数据组合(相关模型除外),则该函数不属于模型。

此外,您可以在任何控制器函数前加上下划线,它不能通过 url 使用。

于 2012-09-21T18:18:56.243 回答
1

处理从数据库中添加和删除条目的逻辑是域业务逻辑的一部分。这些方法应该是模型层的一部分。

由于 CakePHP 的实现非常有限(它假装模型层是活动记录实例的集合),您可以将这些方法移至某种帮助程序,或使用不继承自AppModel. 相反,这样的结构将能够像服务一样将控制器(和整个表示层)与域业务逻辑隔离开来。

于 2012-09-21T21:00:35.890 回答
-2

不,CakePHP 是一个框架,您可以随意为可重用的逻辑部分创建私有函数。应该是鼓励吧。

于 2012-09-21T15:35:19.893 回答