在CakePHP中,如何从帮助程序中调用AppController方法?

时间:2014-02-01 23:30:58

标签: cakephp cakephp-2.0

跟进问题:In CakePHP, where would I put a method that performs a check on the Session User?


背景:在上一个问题中,我被告知放置levelCheck()等方法的正确位置,该方法执行用户级别的半复杂评估,并且是必需的实际上我的所有控制器都是AppController

现在,这种方法对我设计菜单布局和其他视图设备的方式也非常有用。出于这个原因,我想创建一个可以使用该方法的帮助器。

问题:我认识到从视图中调用控制器方法通常不赞成...但是我没有可行的方法来传递数据来复制此​​方法的功能,也没有我想在两个地方复制该方法(违反DRY方法)。

问题:如何从帮助程序中调用此方法,或者是否有更好的方法在视图/元素中使用此方法?

2 个答案:

答案 0 :(得分:0)

将该方法放在AppController中,同时 - 设置一个将保存结果的变量。

beforeRender回调中,将结果设置为viewVar。

一些代码:

// AppController

class AppController extends Controller 
{

  $levelCheckResult = null;

  function levelCheck(){
    $this->levelCheckResult = true/false;
  }


  function beforeRender(){
    $this->set('levelCheckResult', $this->levelCheckResult);
  }
}

就是这样,现在你可以在视图中访问它了。

修改


在app_controller中创建一个公共函数,并在beforeRender()中将app_controller本身发送到视图。

class AppController extends Controller 
{

  function levelCheck(){
    ....
  }


  function beforeRender(){
    $this->set('TheApp', $this);
  }
}
// in the view
$TheApp::levelCheck();

但请再次考虑设计。这种操纵强烈建议你应该改变一些东西。

简而言之 - 视图仍然是程序的后端执行而不是客户端,因此在定义中 - 它应该并且可以从控制器控制......

答案 1 :(得分:0)

我最终使用的解决方案是将方法移动到组件(CurrentUserComponent)。

从那里开始,就像在帮助者的头部调用组件一样简单......

App::uses('CurrentUserComponent', 'Controller/Component');

引用组件的静态方法:

CurrentUserComponent::levelCheck(x,y,z);

我不认为这完全在MVC模式的意图范围内,但它并没有可怕的变形,并且允许从应用程序的任何地方访问该方法。