CakePHP 2.3添加新文件夹以加载模型不起作用

时间:2013-01-04 18:31:11

标签: cakephp-2.0 cakephp-2.3

我在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()时,数据源会出现缺少表错误(在这种情况下为默认)。

模型是否可能未加载正确的数据库配置,因为该配置位于 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),我会收到数据库错误

我在同一个文件夹中有另一个模型(MyModel),其中包含 $ useTable ='mytable'。如果我对其进行了 find(),则会收到错误消息,指出无法找到 mytable 。但是,如果我 $ this-> MyModel-> useTable ='mytable',那么它可以正常工作。

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

编辑3

我只想补充一点,我已经做了大量的测试,问题很明显:Cake“知道”模型在外部文件夹中(通过打印 App :: objects('Model')确认< / strong>,模型列在那里,如果我从该文件夹中删除它,那么它就没有列出)。但即使它知道它在那里,它会忽略模型文件中的任何内容。我已经尝试了下面的所有方法加载模型,但没有一个工作。这是CakePHP中的错误吗?如果没有,我做错了什么?

1 个答案:

答案 0 :(得分: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
}
}