【问题标题】:cakephp $uses, $this->loadModelcakephp $uses, $this->loadModel
【发布时间】:2014-10-26 07:39:31
【问题描述】:

$uses 和 $this->loadModel() 有什么区别?
CakePHPCookbook,第 2 版。
第 61 页:
$this->loadModel('User', 2);
第 62 页:
类 RecipesController 扩展 AppController {
public $uses = array('Recipe', 'User');

提前致谢!

【问题讨论】:

    标签: cakephp controller


    【解决方案1】:

    Uses 定义了控制器默认可以访问的模型,如果你没有定义它,它将是该控制器的模型,即 UsersController 将默认加载用户(以及在 AppController 的 $uses 中定义的任何模型)。

    loadModel 只会在调用它的地方做同样的事情,如果你只需要在一个动作而不是其他动作中使用模型,这会更好。

    您还可以使用 ClassRegistry::init('Recipe')->find('all');等将返回模型的单个实例以供一次性使用,但不会将模型添加到对象映射中。

    您真正应该问自己的是,为什么要将模型加载到控制器中?理想情况下,您应该在模型之间建立关系,例如,如果您在 Recipe 控制器中,您可以调用 $this->Recipe 和 $this->Recipe->User。

    我发现在 Shell 中使用最常见,默认情况下它无法直接访问模型。

    根据 ndm 的评论编辑

    【讨论】:

    • "[...] 每次调用控制器方法时都会添加模型。" 不确定您到底想说什么,但这不正确,甚至在较旧的 Cake 版本中也没有。为什么我提到较旧的 Cake 版本?因为从 2.x 开始,模型是 lazy loaded,单独定义 $uses 不会加载任何内容,只有在您尝试访问模型时才会加载模型,请参阅 Controller::__isset()。
    • 非常感谢。我在插件 JobDirectory 中有这个 sn-p,它可以工作: class JobCategoryNamesController extends JobDirectoryAppController { // public $uses = array('JobDirectory.JobCategoryName'); public function index() { //$this->loadModel('JobDirectory.JobCategoryName'); $res = $this->JobCategoryName->find('all'); $this->set('res',$res);如您所见, $uses 和 $this->load 被注释掉了。它是如何工作的?
    • 根据您的 cmets ndm 进行了编辑,我最初的答案是错误的。 jstar 默认情况下 JobCategoryNames 将使用 JobCategoryName 模型和 JobDirectoryAppController::$uses 中指定的任何模型。如果您指定 $uses,则需要确保数组中有 JobCategoryName 才能继续工作。
    • 非常感谢,HelloSpeakman!你把一切都说清楚了。正如先生指出的那样。 Cornelb:'允许一个控制器通过$uses变量访问额外的模型,当前控制器的模型的名字也必须包括在内',但是我一下子没弄明白。
    【解决方案2】:

    根据uses 和loadmodel 的文档,$uses 是一种让整个控制器都可以使用一个或多个模型的简单方法,而loadModel 用于您想要访问模型时不在$uses 列表中

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2012-08-15
      相关资源
      最近更新 更多