【问题标题】:CakePHP: how to use a model in the app_controllerCakePHP:如何在 app_controller 中使用模型
【发布时间】:2010-10-29 08:25:57
【问题描述】:

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

谢谢

【问题讨论】:

    标签: cakephp controller models


    【解决方案1】:

    嗯,一种方法是添加:

    var $uses = array('Blacklist');
    

    在您的 AppController 班级中。

    也许更好的解决方案是使用名为:loadModel 的 CakePHP 内置方法,如下所示:

    $this->loadModel('Blacklist');
    

    如果您在AppController$uses 数组中添加Blacklist,它将在您的所有控制器中可用,loadModel 只需为特定任务加载模型。

    【讨论】:

    • 你会在应用控制器的哪个方法中调用 loadModel 以便它每次都加载?
    • 使用控制器回调:book.cakephp.org/2.0/en/…
    【解决方案2】:

    尽量避免使用$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

    【讨论】:

      【解决方案3】:

      $ModelName = ClassRegistry::init('ModelName');

      $ModelName->find();

      【讨论】:

        【解决方案4】:

        不幸的是,由于bug #858,您最好暂时避免在AppController 中使用loadModel(),除非您没有使用任何插件(很有可能)。我用来替换$uses 的解决方案是:

        $this->Blacklist = ClassRegistry::init('Blacklist');
        $this->Blacklist->check_blacklist();
        

        请注意,您应该将其放入您的 beforeFilter()beforeRender() (see the cookbook) - 取决于您希望何时执行...

        如果您想在其他站点中使用相同的代码,或者让它在加载链的早期触发,您可以考虑使用一个组件 - 将相同的代码放入您的组件 initialize() functionstartup() 函数中,如果负载链中的点不太重要。

        【讨论】:

        • 这是一个有点强硬的声明——不远处就是说'因为存在错误,最好暂时避免使用 CakePHP'。我从来不需要在 CakePHP 应用程序中使用插件,我已经构建了一些。我对 #858 的解读是,在插件本身中使用 loadModel 是不可取的。
        • 如果你打算在 beforeFilter 中做这个,你不妨使用 $uses。
        • @Leo - 应该清楚的是,这是在给定条件下响应相同问题的替代解决方案,即使用插件运行实例。此外,通过删除我上次使用的$uses,某些事情变得更简单了。
        • OP 没有提到插件。我只提到了插件,因为您提到了插件,而 858 并没有说明避免在插件之外使用 loadModel 。 loadModel 的全部意义在于,您可以在需要的地方即时加载模型,而不是在其他任何地方。
        • 插件控制器扩展了 AppController。因此,AppController 中的代码是从插件的上下文中调用的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        相关资源
        最近更新 更多