【问题标题】:Accessing methods from another CakePHP controller, or better alternative!从另一个 CakePHP 控制器访问方法,或者更好的选择!
【发布时间】:2010-12-08 17:14:27
【问题描述】:

我正在为我的网站创建一个“奖励”系统来鼓励社区归属感,这与堆栈溢出使用徽章的方式非常相似。

该网站是用 CakePHP 构建的,我已经创建了一个 Award 模型、控制器等 - 目前计算用户是否有奖励的方法包含在 Award 控制器中。

但是,我无法确定更新奖励的最佳方式 - 例如,您制作了一定数量的 cmets 并因此获得奖励,CRON 是不够的,否则用户可能会访问他们的个人资料,期待一个奖项,直到 CRON 运行才获得。

我正在考虑使用 requestAction() 调用方法来更新 Award 控制器中的奖项,但这并不真正符合 MVC 设计模式,并且认为必须有更好的方法!

【问题讨论】:

  • 实际模型名称、徽章或声誉与问题无关。您可以考虑不同实体的相同情况。
  • 好吧,我想为这个问题提供一些背景信息,因为它可能会对以下问题的答案有所不同用户的直接影响(例如接收其他用户的 cmets)
  • 对不起,我的意思是关于您标记问题的方式的评论,而不是文本。那里的一切都可以提及

标签: php model-view-controller cakephp controller


【解决方案1】:

如果获得奖励的唯一方法是发表评论,我只需覆盖 Model::save 以确定它是否是添加的新评论。如果是,请调用奖励模型以更新奖励。

如果有多个可以授予奖励的操作,您可以点击每个模型来执行此检查,或者修改 AppModel 以便每次保存都会调用 checkNewAwards()...

或者我没有理解这个问题?

【讨论】:

  • 谢谢,我有大约 20 个不同的奖项,每个奖项都有一个相关的检查方法 - 你认为我应该将这些奖项从 Awards Controller 移到 AppModel 吗?
  • 我想我可能会在那个时候。有超过 20 个奖项,让代码集中执行检查会更好。权衡的是,您将检查每次保存的条件,即使是您通常不会这样做的条件。所以这会花费你一些执行时间,但我认为这可以通过代码可维护性轻松平衡。
  • 为了减少磨损,我可以提供一个奖励列表来检查每个模型保存,所以在 cmets 模型中它只会检查与 cmets 等有关的奖励。我认为结合这里的每个人的建议都可以解决问题!
  • 我认为这将是“最正确”类型的解决方案——良好的平衡。我所做的大部分工作都是关于快速原型领域的,所以我可能会将它放在 AppModel::save() 方法中,只是因为这样更快。不过,很高兴您找到了适合您需求的解决方案。
【解决方案2】:

在帮助程序中创建一个函数并将其放入您的布局中,以便在每次呈现布局时运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2016-05-30
    • 2022-10-24
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多