【问题标题】:Calling a controller's method from within the view CakePHP从视图 CakePHP 中调用控制器的方法
【发布时间】:2012-03-05 09:22:22
【问题描述】:

我一直想知道最好的方法是什么。我有一个 SubmissionsController,在其中有一个 view() 方法,它是每个提交的显示。所有提交的内容都有收藏夹,用户可以对这些收藏夹进行投票。我想根据用户之前是否对某事进行过投票来更改图标。我想过这样做:

// checkExistingFavorite would be a boolean method which returns true if the user has             already favorited it
<?= if (SubmissionsController::checkExistingFavorite($userId, $submissionId)) { ?>
<span style="favorited">Remove Favorite</span>
<? } else { ?>
<span style="not-favorited">Favorite</span>
<? } ?>

但显然,我不应该直接从我的视图中调用 SubmissionsController。我的问题是处理这个问题的最佳方法是什么?每次用户查看提交时都需要检查它,所以我不确定是否应该缓存它?

【问题讨论】:

  • 这通常是一个设计错误。你应该把这些方法放在你的模型中,而不是控制器中。
  • 如何从我的控制器中引用它们? var $uses = 'SubmissionsFavorite' 然后$this-&gt;SubmissionsFavorite-&gt;methodFromSubmissionsFavoriteModel(); ?>
  • 永远不要使用 :) 使用 ClassRegistry::init() 或 loadModel() 代替。 PS:要回答这个问题,您必须了解更多有关 checkExistingFavorite() 方法的信息。

标签: php cakephp view controller cakephp-2.0


【解决方案1】:

这应该在相关的控制器方法中完成,否则您将违反支持 Cake 的 MVC 原则。您可以在 Submission 模型中创建一个 checkExistingFavorite($userId, $submissionId) 函数,以便它可用于所有控制器操作。

使用SubmissionsControllerview() 方法中的函数(通过调用$this-&gt;Submission-&gt;checkExistingFavorite())检查现有收藏夹后,您可以将视图变量设置为truefalse ($this-&gt;set('hasExistingFavourite', $boolean))。

【讨论】:

  • 哦,太好了!现在我将开始将模型用于我的控制器中使用的方法。我以前只是在控制器内做它们。感谢您的帮助。
  • 没问题!当我开始使用 Cake 时,本指南对我有很大帮助,它还简要介绍了“胖模型,瘦控制器”的概念:bakery.cakephp.org/articles/Auzigog/2008/12/29/…
【解决方案2】:

您可以在控制器中检查此情况
基于此设置一个标志 0 或 1,如果有多个数据则制作标志状态数组
将此数组传递给查看
基于传递的数组或值,您可以设置此条件
所以我们可以实现业务逻辑和表示逻辑是不同的

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多