【问题标题】:CakePHP 2.3 adding new folder to load models not workingCakePHP 2.3 添加新文件夹以加载模型不起作用
【发布时间】:2013-01-04 18:31:11
【问题描述】:

我在我的 bootstrap.php 中使用以下代码(如 here 解释)也从另一个文件夹加载模型:

App::build(array('Model' => array('/my/path/to/models')));

似乎有效。我在该文件夹中有一个模型 MyModel,我将它包含在我想像往常一样使用它的控制器中:

var $uses = array('MyModel');

如果我打印 App::objects('Model'),模型 MyModel 会显示在列表中,因此我认为它已正确加载。但是,当我尝试使用模型时(即 $this->MyModel->find() 它永远不会找到任何东西,它总是返回一个空数组。

请注意,如果我将相同的模型 (MyModel) 放在典型模型文件夹 (app/Model/) 中,则一切正常。

我缺少什么来完成这项工作?

编辑

好的,所以当模型放置在 app 之外的那个文件夹中时,问题似乎出在与数据库的连接上。通过上面显示的代码,Cake 找到了模型。但是,当我执行 find() 时,我得到数据源的 missing table 错误(在本例中为 default)。

模型是否有可能没有加载正确的数据库配置,因为该配置位于 app/Config 文件夹中?如何使该模型加载该配置?如果我必须将该配置放在其他位置(可能在同一个 outside 文件夹中?)我可以这样做,但我如何告诉模型找到它?

编辑 2

我现在可以更好地了解问题所在。如果我将模型放在不同的文件夹中(app/Model 除外)并使用 App::build() 设置新文件夹的路径,Cake 会找到它,毫无疑问(我使用 App::objects('Model') 并且该模型与 app/Model 中的所有其他模型一起列出)。

然而,Cake 并没有真正读取模型类中的内容,或者至少不是所有内容。它似乎读取了 $useDbConfig 变量,但它忽略了 $useTable 以及我在该模型中定义的任何函数。我的模型示例:

class Usuario extends AppModel {

var $name = 'Usuario';
var $primaryKey = 'id_usuario'; 
var $useDbConfig = 'BD_ControlAcceso';

function createTempPassword($len) {

    //some code
}
}

如果我执行 $this->Usuario->find('all'),它会正确返回所有记录。但是,如果我调用 $this->Usuario->createTempPassword(7) 我会收到 Database Error

我在同一个文件夹中有另一个模型 (MyModel),其 $useTable = 'mytable'。如果我对其执行 find(),我会收到一条错误消息,提示找不到 mytable。但是,如果我这样做 $this->MyModel->useTable = 'mytable' 那么它工作正常。

这怎么可能?这是怎么回事?

编辑 3

我只想补充一点,我已经进行了广泛的测试,问题很明确:Cake“知道”模型在外部文件夹中(通过打印确认 App::objects('Model'),该模型在此处列出,如果我将其从该文件夹中删除,则它不会列出)。但即使它知道它的存在,它也会忽略模型文件中的任何内容。我已经尝试了以下所有方法来加载模型,但都没有奏效。这是 CakePHP 中的错误吗?如果没有,我做错了什么?

【问题讨论】:

  • 你不应该使用App::uses('MyModel', 'Model');吗?
  • 具体在哪里?我尝试将它放在控制器页面的顶部,但没有...

标签: cakephp-2.0 cakephp-2.3


【解决方案1】:

你应该使用App::uses('MyModel', 'Model') 并且应该像这样在类声明之前:

<?php

App::uses('MyModel', 'Model');
App::uses('AppController','Controller');
class UsersController extends AppController {
 // controller class
}

要尝试的另一件事是将模型加载到您需要的位置:

$this->loadModel('MyModel');

您可以尝试的另一件事是模型类顶部的模型实例化。尝试将您的模型更新为:

App::uses('AppModel','Model');
class Usuario extends AppModel {

var $name = 'Usuario';
var $primaryKey = 'id_usuario'; 
var $useDbConfig = 'BD_ControlAcceso';

function createTempPassword($len) {

    //some code
}
}

【讨论】:

  • 感谢您的回复,我试试看。不过有一个问题,我是否也应该将App::build(array('Model' =&gt; array('/my/path/to/models'))); 放入引导程序中?
  • 如果您的模型在您的 App/Model 文件夹中,则没有。 Cake 已经可以找到它了。如果你把它放在 App/Model 文件夹以外的地方,那么可以。如果模型文件夹中还没有模型,Cake 仍然需要知道在哪里可以找到模型。
  • 这让我发疯了...所以现在看来​​它实际上是从外部“模型”文件夹中加载模型...所以为了进行测试,我删除了 Usuario 模型来自两个“模型”文件夹(“app/Model”文件夹中的一个和外部“模型”文件夹中的一个)。好吧,即使没有那个模型,登录功能仍然可以工作并找到用户!!!这怎么可能?不可能是因为它使用了默认的数据库配置,因为这个 Usuario 模型使用了不同的数据库。那么如果我没有这个模型,Cake 怎么会使用它呢???
  • 缓存?您可能想要删除所有缓存文件(在 app/tmp 文件夹中查找缓存)并查看它是否仍然有效。我的赌注是没有。
  • app/tmp/cache 文件夹有 3 个子文件夹(模型、持久性和视图),它们都是空的。在开发过程中,我在 core.php 配置文件中也有Configure::write('Cache.disable', true);,所以我想这就是它们为空的原因......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2016-03-26
相关资源
最近更新 更多