我在模型中有一个方法,我想在每次请求页面时执行它,所以我想我需要从app_controller调用它,但似乎无法让它工作。我想使用的模型叫做Blacklist,它有一个名为check_blacklist()的方法,这是我想在每次请求页面时运行的。有谁知道我应该怎么做?
由于
答案 0 :(得分:14)
嗯,一种方法是添加:
var $uses = array('Blacklist');
在AppController
课程中。
也许更好的解决方案是使用名为loadModel的CakePHP内置方法,如下所示:
$this->loadModel('Blacklist');
如果您在Blacklist
中的$uses
数组中添加AppController
,它将在所有控制器中可用,loadModel
只需为特定任务加载模型
答案 1 :(得分:3)
尽量避免使用$uses
数组,因为它会为所有操作增加一些开销,无论模型是否在该操作中使用。
正如Pawel所说,你可以使用$this->loadModel('Blacklist');
它应该位于$this->Blacklist->check_blacklist()
e.g。
function view($id)
{
if($id)
{
$this->loadModel('Blacklist');
$this->Blacklist->check_blacklist();
...
}
}
如果使用得非常广泛,我可能会在app_model上编写该函数。
编辑:
此处介绍了loadModel的使用:http://book.cakephp.org/view/845/loadModel
答案 2 :(得分:1)
$ ModelName = ClassRegistry :: init('ModelName');
$ ModelName->发现();
答案 3 :(得分:0)
不幸的是,由于bug #858,你最好的办法是避免在AppController中使用loadModel()
,除非你没有使用任何插件(很可能)。我用来替换$uses
的解决方案是:
$this->Blacklist = ClassRegistry::init('Blacklist');
$this->Blacklist->check_blacklist();
请注意,您应将其放在beforeFilter()
或beforeRender()
(see the cookbook)中 - 具体取决于您希望何时执行...
如果您想在其他网站中使用相同的代码,或者在加载链的早期版本中使用它,您可以考虑使用组件 - 在组件initialize()
function中放置相同的代码,或{{1如果负载链中的点不太重要,则运行。