2014-10-04 72 views
0

更新:請看到我的編輯部分的下方,我解釋一下測試CakePHP的模型忽略DATABSE設置

我的工作在網站上使用CakePHP 2.5.1後,我發現,和我遇到一個很奇怪的行爲:2款我似乎拒絕使用不同的數據庫配置(而不是默認的),如果我不把它放在蛋糕的默認型號文件夾(如果我把它放在一個那裏一切都很好)。

兩款機型都位於同一個文件夾中,這恰好是不是默認的模型文件夾(這是因爲這些都與其他網站共享的,我有,我把所有的那些共享一個集中的地方)。

做蛋糕找到那些我用下面的代碼行中bootstrap.php中文件型號:App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model')));

的2個型號我有人稱CampanyaEjercicioMultChoice

一切似乎是正確設置:

  • 如果我打印App::objects('Model')我可以看到上市有兩種型號,這意味着蛋糕被發現他們在外部文件夾
  • 如果我打印get_class_vars('DATABASE_CONFIG')我可以看到這兩個數據庫配置:默認一個,通過Campanya,並且定製用於一個(稱爲BD_Contenidos),使用Ejercic ioMultChoice
  • 這兩種型號都包含在AppController.php$uses變量數組中。

我可以撥打Campanya模型在控制器中沒有任何問題。然而,調用EjercicioMultChoice模型時,我得到以下錯誤:

MISSING DATABASE TABLE 
Error: Table ejercicio_mult_choices for model EjercicioMultChoice was not found in datasource default. 

這是EjercicioMultChoice模型文件的樣子:

class EjercicioMultChoice extends AppModel { 

public $name = 'EjercicioMultChoice'; 
public $primaryKey = 'id'; 
public $useTable = 'ejercicios_multiple_choice'; 
public $useDbConfig = 'BD_Contenidos'; 
} 

正如你可以看到,該模型表明以使用Cake知道的特定數據庫配置,但是在上面顯示的錯誤中,它表示它無法在數據源中找到表格,默認爲。它不能,因爲它不在那裏,它在另一個數據庫中的另一個表中(順便說一下,這個其他數據庫與默認的數據庫在同一臺服務器上,我在其他項目中使用它沒有問題)。

正如我上面提到的,如果我移動完全相同的EjercicioMultChoice。php模型文件到Cake的默認app/Model/文件夾,那麼我沒有任何問題。

所以我在這裏有點迷路,我不知道我還能找到什麼來找到問題所在。任何幫助將非常感激!!

編輯

所以我相信我已經發現這個問題是什麼,以及一個關於它的解決辦法,但我還是想知道爲什麼發生這種情況,我怎麼能使其工作,因爲它應該。

如果我調用模型前添加這些2行代碼(兩者的),那麼這一切工作正常:

$this->EjercicioMultChoice->setDataSource('BD_Contenidos'); 
$this->EjercicioMultChoice->setSource('ejercicios_multiple_choice'); 

這顯然意味着,即使蛋糕找到EjercicioMultChoice.php模型文件(其指示數據庫和表名稱)忽略那些2個變量($ useTable$ useDbConfig)。讓它工作的唯一方法是用上面寫的方法手動設置這兩個變量。

這是怎麼發生的?如果模型文件在默認文件夾,這不會發生......

回答

0

好吧好吧好吧,看來問題是,我沒有把尾部/應用::編譯()路徑。正確的應該是App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model/')));

什麼讓我很難弄清楚這一點是Cake實際上找到該文件夾​​中的模型,即使沒有尾隨/,但由於某種原因阻止它加載內部內容這些模型文件。

無論如何,它現在的作品!

0

據我所知,蛋糕不會加載您提供的模型文件! 您可以在該(共享)文件的第一行中添加一個exit();調用,並查看您的應用程序是否贊同(通過顯示白頁 - ))。

如果不是,您的模型文件不會被cakephp拾取。

另一種檢查模型文件是否被獲取的方法是定義一個像文件public $myModelTestVar = 'sharedModel';這樣的自定義成員變量,並檢查使用該模型的控制器中的變量(操作中僅爲debug($this->EjercicioMultChoice))。

如果你可以確認/證明文件被拾取,我會自願設置這個場景,並嘗試自己在那裏發生什麼 - 但我非常確定我是對的。

debug(dirname(ROOT) . DS . '_shared/Cake_v2/Model') 

要證明它指向你期望的位置。

+0

感謝您的幫助,這是類似的東西(請參閱我的答案,我解釋發生了什麼) – Albert 2014-10-07 15:32:51