CakePHP:如何在app_controller中使用模型

时间:2010-10-29 08:25:57

标签: cakephp controller models

我在模型中有一个方法,我想在每次请求页面时执行它,所以我想我需要从app_controller调用它,但似乎无法让它工作。我想使用的模型叫做Blacklist,它有一个名为check_blacklist()的方法,这是我想在每次请求页面时运行的。有谁知道我应该怎么做?

由于

4 个答案:

答案 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如果负载链中的点不太重要,则运行。