【问题标题】:Is There A Downside To Calling Models From Helpers In CakePHP?在 CakePHP 中从助手调用模型有缺点吗?
【发布时间】:2011-09-22 20:23:26
【问题描述】:

一点上下文:我需要缓存我的 CakePHP 站点的主页——除了一小部分,它根据 IP 地址向用户显示本地事件。

您显然可以使用 标记来指示不应缓存的页面部分;但是您不能用这些标签包围控制器设置的变量以使其动态化。据我所知,一旦页面被缓存,控制器操作就完成了。

可以用 nocache 标签有效地包围的是元素和助手。因此,我在这些标签中创建了一个元素,它调用一个辅助函数来访问模型并获取适当的数据。从我正在使用的助手那里获取模型:

$this->Modelname =& ClassRegistry::init("Modelname");

然而,在我看来,无论是就 CakePHP 和一般 MVC 原则而言,这都是一种不确定的做事方式。所以我的问题是,这是完成我想做的事情的适当方式,还是应该敲响警钟?有没有更好的方法来实现我在这里错过的目标?

【问题讨论】:

    标签: model-view-controller caching cakephp helpers controllers


    【解决方案1】:

    除了打破所有精心设计的 MVC 原则之外?

    除了将这个项目放入一个元素之外,为什么不用一点点 ajax 来获取它呢?

    1. 将调用放入自己的控制器操作中,这样目标 URL -> /controller/action(非常方便!)
    2. 将 IP 传回该操作以在查找调用中使用
    3. 将 ajax 更新回调设置为元素内的目标,并相应地调用结果

    无需直接从视图中调用模型,也无需使用 requestAction 陷入困境。 :)

    HTH

    【讨论】:

    • 听起来不错。您是否认为 ajax 提取本质上会比使用 requestAction 更好?我很容易看出我有各种选择,比我最初仓促的计划更好,更难说为什么一个比另一个好得多......
    • 在视图阶段对象需要独立数据的所有情况中,可能有 90% 的情况,是的,ajax > requestAction。 MVC 就像在河里划着一艘装满好东西的独木舟。 requestAction -> 你转身把 Cake 划回河里。 Ajax -> 你打电话给你的朋友在你的手机上将数据浮动到内胎上。 (在冷却器中。;))它可能有点湿,但它比划桨回到河上要好。 Ergo -> PHP 的 requestAction() 必须向后移动才能从 $this 是 la View 的位置获得; ajax 触发你的控制器动作 = 传送到开头,使用新的 $this。
    • 谢谢,你的独木舟类比说服了我,我会试一试;)
    • 我在这里没有得到关于这个的论据 - 使用 AJAX 你有额外的 HTTP 请求的开销和额外的 javascript 处理的复杂性。服务器上发生的事情(requestAction)和网络上发生的事情(AJAX)之间的性能差异将是规模的数量级,更不用说浏览器在重排内容时必须做的任何工作(想想这在移动设备上如何工作)实例)。当然,在某些延迟加载情况下,这可能是一种有用的技术。
    • >_> 与在布局中管理 requestAction 相比,jQuery .post 究竟“太复杂”了多少?由于神奇的粘合剂 $this,蛋糕出了名的缓慢和臃肿。在 2001 年,使用同步服务器调用处理高度动态的站点范围的数据过程不再那么酷了。我很难想象任何人如何在不明智地使用这种特定技术的情况下管理一个连贯的应用程序,因为它的成熟实现 -> 在组件 / AppController 等(没有完全放弃浏览器 -> 无论如何,用一些 Flex 变得正义。)
    【解决方案2】:

    与其使用 Helper,不如尝试将代码放入元素中并在元素内部使用 requestAction。

    查看此链接

    http://bakery.cakephp.org/articles/gwoo/2007/04/12/creating-reusable-elements-with-requestaction

    这比尝试在帮助程序中使用模型要好得多。

    【讨论】:

    • 啊哈!这似乎比通过扭曲来访问 Helper 内部的模型要好得多。不过还有一个问题:requestAction 上的 Cookbook 部分说“如果在不缓存 requestAction 的情况下使用会导致性能不佳...... requestAction 最好与(缓存的)元素结合使用”。显然,当我在我 想要缓存的元素上显式使用 requestAction 时,我会感到有点紧张!你会说这是正确的轨道吗?谢谢!
    • 过去对此进行了相当多的讨论,结果似乎是使用 requestAction 的开销通常是可以接受的。如果这可能是对您服务器的限制,我个人想检查脚本内存使用情况。顺便说一句,如果你担心 helpers 和模型之间的依赖关系不要看 FormHelper 的代码,你可能会做噩梦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多