在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