【问题标题】:Should controllers avoid private functions at CakePHP?控制器应该避免 CakePHP 的私有函数吗?
【发布时间】:2012-09-21 15:33:15
【问题描述】:

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

有时,诸如 adddelete 之类的函数可能太大了,我更喜欢将它们分开。 我应该将这些函数放在模型中而不是在控制器上设为私有吗?

谢谢。

【问题讨论】:

  • 你不应该需要使用私有方法。改用受保护的。在框架上下文中,将某物设为私有是没有意义的,因为在某些时候每个类都可以在某个时候被扩展。但是控制器内部的受保护方法很常见。

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


【解决方案1】:

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

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

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

class User extends AppModel {

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

} 

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

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

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

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

【讨论】:

  • 如何区分必须在控制器中的功能和必须在模型中的功能?
  • 好吧,可能与插入或取出记录有关的所有内容都将进入模型,包括与插入和提取相关的前后逻辑。但是,像解释/计算/来自数据甚至可能涉及其他模型的事情最好保存在控制器中。 “控制器将数据呈现给视图”。控制流方法必须在控制器中。诸如身份验证之类的事情。与第三方交互的方法,例如电子邮件、其他 API 甚至打开您的 API。
  • 因此,在无法通过 url 访问的控制器上使用私有(或受保护)函数没有任何问题。 (如果他们只处理数据而不是任何模型)
  • 绝对。您可以随意在控制器上使用私有/受保护的方法,但如果可能的话,请避免使用它们的数据操作
  • 是的,它可以在控制器中。如果它太长并且你必须在其他控制器中使用它,考虑为它创建一个组件。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      没有。 CakePHP 是一个框架,您可以随意为可重用的逻辑部分创建私有函数。可能会受到鼓励。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-18
        • 2018-07-29
        • 2014-10-24
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 2019-11-13
        相关资源
        最近更新 更多