CakePHP - 在这种情况下如何不违反MVC或DRY

时间:2012-09-20 19:31:56

标签: php cakephp

我有一个控制器(对于我的主页),其中我有大约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());

我添加到主页控制器的每个操作?

如何妥善处理这种情况?

2 个答案:

答案 0 :(得分:1)

假设所有操作都需要设置fetchednews

,那么使用beforeFilter怎么样?
function beforeFilter() {
    $this->set('fetchednews', $this->News->getLatestNews());
}

答案 1 :(得分:0)

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

我不熟悉Cake,因为我倾向于自己使用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());
}