2

別のフォルダーからもモデルをロードするために、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が発生します。

同じフォルダーに$useTable = 'mytable'を持つ別のモデル (MyModel) があります。それにfind()を実行すると、 mytable table could not be foundというエラーが表示されます。ただし、$this->MyModel->useTable = 'mytable'を実行すると、正常に動作します。

これはどのように可能ですか?何が起きてる?

編集3

広範なテストを行った結果、問題は明らかであることを付け加えたいと思います: Cake は、モデルが外部フォルダーにあることを「認識」しています ( App::objects('Model')を印刷することで確認され、モデルはそこにリストされています。そのフォルダーから削除すると、リストに表示されません)。しかし、それがそこにあることを認識していても、モデル ファイル内にあるものはすべて無視します。モデルをロードするために以下のすべての方法を試しましたが、どれも機能しませんでした。これは CakePHP のバグですか? そうでない場合、私は何を間違っていますか?

4

1 に答える 1

1

App::uses('MyModel', 'Model')次のようにクラス宣言の前に and is を使用する必要があります。

<?php

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

もう 1 つ試すことは、必要な場所にモデルをロードすることです。

$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
}
}
于 2013-01-16T02:54:53.797 に答える