CakePHP–;在这种情况下,如何不违反MVC或DRY

CakePHP–;在这种情况下,如何不违反MVC或DRY,php,cakephp,Php,Cakephp,我有一个控制器(用于我的主页),其中我有大约5-6个操作来呈现相同的视图(索引),因为用户可以在页面上为不同的情况选择不同的参数。每个动作处理每个情况 现在我需要在主页上显示最新消息。看起来很简单。。。 所以我补充说 $this->set('fetchednews', $this->News->getLatestNews()); 我的索引操作,它的工作,因为它应该是 但是正如我之前所说的,我有一组不同的操作,具有相同的页面视图 所以,若用户访问domain.com,他会看到最

我有一个控制器(用于我的主页),其中我有大约5-6个操作来呈现相同的视图(索引),因为用户可以在页面上为不同的情况选择不同的参数。每个动作处理每个情况

现在我需要在主页上显示最新消息。看起来很简单。。。 所以我补充说

$this->set('fetchednews', $this->News->getLatestNews());
我的索引操作,它的工作,因为它应该是

但是正如我之前所说的,我有一组不同的操作,具有相同的页面视图

所以,若用户访问domain.com,他会看到最新消息,但若用户点击链接,例如

domain.com/mainPageController/sortById/1 
他没有看到最新消息,因为

action sortById
没有设置$this->set('fetchednews',$this->News->getLatestNews())

我应该使用元素吗?在元素中使用

$news = $this->News->getLatestNews();
然后在索引视图中使用此元素?或者我需要重复一遍

$this->set('fetchednews', $this->News->getLatestNews());
添加到主页控制器的每个操作


如何正确处理这种情况?

如果我是你,我会将需要共享的所有功能打包到一个新方法中,该方法将控制器作为参数,然后执行常见操作。您仍然需要来自需要新闻的每个操作的调用,但至少您可以在单个位置修改它/添加其他代码

我不熟悉蛋糕,因为我倾向于自己使用CI,但类似于

function MyAction1() {
    //Other code
    $this->CommonCode();
}

function CommonCode() {
    $this->set('fetchednews', $this->News->getLatestNews());
}
或者,如果您希望将函数移到控制器之外(以避免将其解释为动作本身),请将控制器传递到方法中

function MyAction1() {
    //Other code
    CommonCode($this);
}

//Different class
function CommonCode($controller) {
    $controller->set('fetchednews', $this->News->getLatestNews());
}
假设所有操作都需要设置
fetchednews
,那么使用a如何

function beforeFilter() {
    $this->set('fetchednews', $this->News->getLatestNews());
}

假设所有操作都需要设置
fetchednews
,那么使用
beforeFilter
如何?这是一个很好的建议。“我现在就试试,谢谢。”马特哈金斯谢谢,这就是我要找的。如果需要,请将您的建议作为答案发布。您应该使用beforeRender()设置视图变量而不是beforeFilter();很好的呼叫ADman,我忘了CakePHP允许这样做。我已经使用Rails太久了:)