2010-06-17 58 views
0

也許我一直在盯着這個問題太久,這比我想象的要簡單得多,但我現在被卡住了。Zend Framework中數據庫模型的位置 - 希望將它們集中起來

我有三個網站將共享數據庫模型。我已經構建了我的應用程序,以便爲每個站點都有一個應用程序目錄,併爲每個站點提供一個公共目錄。數據庫模型與Zend Framework和我的第三方庫一起存放在庫中的一個目錄中。我使用Autoloader類,當我嘗試實例化一個我的數據庫類時,它失敗。庫目錄位於我的包含路徑中,但由於某種原因它拒絕實例化我的類。

這將工作,如果我的應用程序目錄中有我的模型,但這不是重點。他們應該是圖書館中的共享課程。

$model = new Model_Login(); 
$model->hello_world(); 

當它在庫中時失敗。該類只是一個測試:

class Model_Login 
{ 
    public function hello_world() 
    { 
     echo "hello world"; 
    } 
} 

一切工作,直到我嘗試實例化我的一個模型。我甚至嘗試將類重命名爲其他東西(Db_Login),但這也不起作用。有任何想法嗎?提前致謝。從引導

自動加載機:

$autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => '', 
     'basePath' => dirname(__FILE__), 
)); 
+0

請您編輯您的文章,以包含application.ini的部分或設置自動裝載器的引導類。此外,大概你的模型登錄類是在庫/ Model/Login.php? – 2010-06-17 13:17:54

+0

已添加自動加載器代碼。 – jeffkolez 2010-06-17 15:25:19

回答

1

好吧,你在引導程序中使用模塊自動加載器。它被設計用於模塊引導程序,因爲它僅搜索一個目錄樹(通常是應用程序/模塊中的特定目錄),而不是使用包含路徑。它可以在主引導程序中用作默認模塊的自動加載器,這就是爲什麼當您將它放入應用程序/模型中時您的類可以工作。

我想你想切換到使用標準的自動加載器。

我假設在你的引導類你現在有這樣的事情:

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => '', 
     'basePath' => dirname(__FILE__), 
    )); 

    return $autoloader; 
} 

它改成這樣:

protected function _initAutoloader() 
{ 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->setFallbackAutoloader(true); 

    return $autoloader; 
} 

此設置自動加載機(默認情況下也不會建立起來自動加載Zend Framework類),然後告訴它使用這個自動加載器來處理任何不與另一個名稱空間匹配的名稱空間(因爲你的類沒有名稱空間)。通過這種方法,您可以將任何使用PEAR命名約定的類放到您的庫目錄中並在代碼中使用它。

或者你可以這樣做:

protected function _initAutoloader() 
{ 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->registerNamespace('Model'); 

    return $autoloader; 
} 

其中規定了自動加載,然後告訴它使用這個自動加載的命名空間「模型」,這將符合您Model_Login類。

+0

是的 - 那個伎倆 - 謝謝! – jeffkolez 2010-06-18 02:12:56

1

我會使用圖書館目錄來存儲所有這些模型。該目錄可以被所有網站共享。

我有以下方向:

應用

  • CONFIGS

  • 車型

  • 控制器

  • 意見

  • myns名字

  • 的Zend

公共

和我的配置我有:

includePaths.library = APPLICATION_PATH "/../library" 
autoloaderNamespaces.Myns = Myns_ 

,讓我將文件存儲在myns名字,並呼籲: Myns_Login

+0

這就是我想要做的,但自動加載器打得不好。無法弄清楚原因。 – jeffkolez 2010-06-17 12:59:00

+0

自動加載器不會自動設置名稱空間。在聲明庫配置後,添加autoloaderNamespaces指令:autoloaderNamespaces.Myns = Myns_ – MANCHUCK 2010-06-17 13:19:38

+0

不應該把自動加載程序指向正確的目錄嗎?我不確定我是否理解命名空間如何適應這裏。 – jeffkolez 2010-06-17 13:47:48

3

在你引導使用

protected function _initAutoload() { 

    $autoloader = new Zend_Application_Module_Autoloader(array(
       'namespace' => 'Default_', 
       'basePath' => dirname(__FILE__), 
      )); 
    $autoloader->addResourceType('models', 'models/', 'Models'); 
    return $autoloader; 
} 

然後,只需命名對象:

$model = new Default_Models_Login(); 
$model->hello_world(); 
+0

你也可以將命名空間設置爲一個空字符串,如果你不想使用它,只需將模型稱爲Model_Login – Mark 2010-06-17 15:42:07

+0

@Mark:的確如此。我很習慣擁有模塊,我只是忘記了這一點。謝謝! – Iznogood 2010-06-17 16:21:54

1

那麼,我有類似的問題,並花了半天的時間試圖找出答案。試驗後,實際上你可以使用默認設置爲自動加載模塊:

protected function _initAutoload() { 

    $autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'Default_', 
      'basePath' => dirname(__FILE__), 
     )); 
    $autoloader->addResourceType('models', 'models/', 'Models'); 
    return $autoloader; 
} 

請務必相應調整基本路徑值,所以它可以讀取你的應用程序文件夾的模型文件夾。

對於我的,我使用3x dirname修復它,因爲模型文件夾是我的模塊引導文件的幾個級別。應用程序>模塊>默認

相關問題