跟进问题:In CakePHP, where would I put a method that performs a check on the Session User?
背景:在上一个问题中,我被告知放置levelCheck()
等方法的正确位置,该方法执行用户级别的半复杂评估,并且是必需的实际上我的所有控制器都是AppController
。
现在,这种方法对我设计菜单布局和其他视图设备的方式也非常有用。出于这个原因,我想创建一个可以使用该方法的帮助器。
问题:我认识到从视图中调用控制器方法通常不赞成...但是我没有可行的方法来传递数据来复制此方法的功能,也没有我想在两个地方复制该方法(违反DRY方法)。
问题:如何从帮助程序中调用此方法,或者是否有更好的方法在视图/元素中使用此方法?
答案 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模式的意图范围内,但它并没有可怕的变形,并且允许从应用程序的任何地方访问该方法。