控制器是否应该避免CakePHP的私有功能?

时间:2012-09-21 15:33:15

标签: cakephp cakephp-2.0 cakephp-appmodel private-methods

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

有时某些功能(例如添加删除)可能会很大,我宁愿将它们分开。 我应该将这些功能放在模型中,而不是在Controller上设置私有吗?

感谢。

4 个答案:

答案 0 :(得分:4)

是的,如果你把你的方法保留在模型中,它可能是最好的。就像你自己在评论中提到的那样,“保持模特胖和控制器变瘦”。控制器只是一种应该在模型和视图之间进行交互的媒介。

当您必须处理数据源,表中的更改时,问题就出现了。如果您的控制器很胖,那么您可以在任何地方使用这些字段,现在您将在不应该使用的地方清理整个设置。

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

class User extends AppModel {

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

} 

上述方法可以通过模型和控制器中的每个其他方法访问,这与用户有关。

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

重定向的东西并不是那么糟糕,但考虑一下如果你在其他地方重写了逻辑会发生什么,然后你的ActiveUsers实现会发生变化。你最终必须纠正所有事情。

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

答案 1 :(得分:1)

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

此外,您可以使用下划线为任何控制器功能添加前缀,但不会通过网址提供。

答案 2 :(得分:1)

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

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

答案 3 :(得分:-2)

没有。 CakePHP是一个框架,可以为可重用的逻辑位创建私有函数。这可能是鼓励的。