Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CakePHP中,如何从助手调用AppController方法?_Cakephp_Cakephp 2.0 - Fatal编程技术网

在CakePHP中,如何从助手调用AppController方法?

在CakePHP中,如何从助手调用AppController方法?,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,后续问题: 背景:在我的上一个问题中,我被告知放置方法(如levelCheck())的正确位置是AppController,该方法执行对用户级别的半复杂评估,并且几乎在我的所有控制器中都需要 现在,这种方法对于我设计菜单布局和其他视图设备的方式也非常有用。因此,我想创建一个可以使用该方法的助手 问题:我认识到,通常不赞成从视图调用控制器方法。。。但是,我没有可行的方法来传递数据来复制此方法的功能,也不希望在两个地方复制此方法(违反了DRY方法) 问题:那么我如何从帮助程序调用此方法,或者是否有

后续问题:


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

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

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


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

将此方法放入AppController,同时-设置一个将保存结果的变量

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

一些代码:

// AppController

class AppController extends Controller 
{

  $levelCheckResult = null;

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


  function beforeRender(){
    $this->set('levelCheckResult', $this->levelCheckResult);
  }
}
就这样,现在您可以在视图中访问它

class AppController extends Controller 
{

  function levelCheck(){
    ....
  }


  function beforeRender(){
    $this->set('TheApp', $this);
  }
}
// in the view
$TheApp::levelCheck();
编辑
在应用程序控制器中创建一个公共函数,并在
beforeRender()
中,将应用程序控制器本身发送到视图

class AppController extends Controller 
{

  function levelCheck(){
    ....
  }


  function beforeRender(){
    $this->set('TheApp', $this);
  }
}
// in the view
$TheApp::levelCheck();
但请重新考虑设计。这种操纵强烈建议你在那里改变一些东西


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

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

从那以后,只需在助手的头部调用组件即可

App::uses('CurrentUserComponent', 'Controller/Component');
并引用组件的静态方法:

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

我不认为这完全符合MVC模式的意图,但它不会可怕地扭曲它,并允许从应用程序中的任何位置访问该方法。

正如我在问题中提到的,没有任何方法可以传递数据,以充分提供我在方法本身中获得的灵活性。我基本上可以检查所有可能的场景,看看用户是否符合条件。确切的细节对问题的范围没有真正的帮助,但请理解,我无法传递足够的数据来表示我可以使用该方法测试的范围。。。所以我需要实际的方法。@xtraorange您所描述的(您的视图应该连接到数据库)只能表明您做错了什么。在MVC中,视图使用的逻辑是基本的,最多应该用于控制流或聚合。该逻辑只是指示用户是否应该有访问权限。我不认为“如何”确定这与讨论真正相关。如果有帮助的话,就把它看作是检查一个用户是否是管理员。。。但是要认识到,要做到这一点,它需要一个自定义函数(而不仅仅是直接读取会话)。。。这大概就是这个方法的目的,只是检查更多的可能性,而不仅仅是管理。这说明了吗?我还是不明白为什么要在视图中调用它。视图仅用于渲染已处理的数据。视图在控制器完成后执行,这是mvc执行的自然顺序###使用我的方式将设置一个变量(它可以是具有任何类型信息的对象…),可以与任何对象进行比较。#请注意,通过在preRender调用之前添加
,将确保每次都会设置变量。我了解MVC的顺序,但并非所有内容都符合MVC模式;这根本不是它的工作原理,我相信你知道这一点。比如菜单,我根据方法的结果为各种检查创建链接。。。或者根据使用该方法的检查添加或删除的任何其他元素。再一次(我很有信心,所以请相信我并考虑其他的解决方案),一个变量将不可能包含方法可以检查的许多可能的维度。虽然在蛋糕2。x中有点早,但是你可以用你的LealChChice逻辑考虑<代码>特性< /代码>。如果您有PHP5.4.x。只需将trait放入
/Lib
并调用
App::uses('LevelCheckTrait','Lib')并在控制器/助手写入
中使用LevelCheckTrait