【发布时间】:2010-10-29 08:25:57
【问题描述】:
我在模型中有一个方法,我想在每次请求页面时执行它,所以我想我需要从 app_controller 调用它,但似乎无法让它工作。我要使用的模型称为 Blacklist,它有一个名为 check_blacklist() 的方法,这是我每次请求页面时都想运行的方法。有谁知道我应该怎么做?
谢谢
【问题讨论】:
标签: cakephp controller models
我在模型中有一个方法,我想在每次请求页面时执行它,所以我想我需要从 app_controller 调用它,但似乎无法让它工作。我要使用的模型称为 Blacklist,它有一个名为 check_blacklist() 的方法,这是我每次请求页面时都想运行的方法。有谁知道我应该怎么做?
谢谢
【问题讨论】:
标签: cakephp controller models
嗯,一种方法是添加:
var $uses = array('Blacklist');
在您的 AppController 班级中。
也许更好的解决方案是使用名为:loadModel 的 CakePHP 内置方法,如下所示:
$this->loadModel('Blacklist');
如果您在AppController 的$uses 数组中添加Blacklist,它将在您的所有控制器中可用,loadModel 只需为特定任务加载模型。
【讨论】:
尽量避免使用$uses 数组,因为它会为所有操作增加一些开销,无论该操作中是否使用了模型。
正如 Pawel 所说,您可以使用 $this->loadModel('Blacklist'); 它应该位于动作中,比如视图,就在 $this->Blacklist->check_blacklist() 之前
例如
function view($id)
{
if($id)
{
$this->loadModel('Blacklist');
$this->Blacklist->check_blacklist();
...
}
}
如果这被广泛使用,我可能会在 app_model 上编写函数。
编辑:
此处介绍了 loadModel 的使用:http://book.cakephp.org/view/845/loadModel
【讨论】:
$ModelName = ClassRegistry::init('ModelName');
$ModelName->find();
【讨论】:
不幸的是,由于bug #858,您最好暂时避免在AppController 中使用loadModel(),除非您没有使用任何插件(很有可能)。我用来替换$uses 的解决方案是:
$this->Blacklist = ClassRegistry::init('Blacklist');
$this->Blacklist->check_blacklist();
请注意,您应该将其放入您的 beforeFilter() 或 beforeRender() (see the cookbook) - 取决于您希望何时执行...
如果您想在其他站点中使用相同的代码,或者让它在加载链的早期触发,您可以考虑使用一个组件 - 将相同的代码放入您的组件 initialize() function 或 startup() 函数中,如果负载链中的点不太重要。
【讨论】:
$uses,某些事情变得更简单了。