我在 bootstrap.php 中使用以下代码(如此处所述)也从另一个文件夹加载模型:
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()时,我得到数据源的缺失表错误(在这种情况下为默认值)。
模型是否有可能没有加载正确的数据库配置,因为该配置位于app/Config文件夹中?如何使该模型加载该配置?如果我必须将该配置放在其他位置(可能在同一个外部文件夹中?)我可以这样做,但我如何告诉模型找到它?
编辑 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 中的错误吗?如果没有,我做错了什么?