2012-11-28 61 views
1

我正在構建一個自定義插件,它包含我試圖與插件緊密結合的模式。例如,我有一個引用'store-rw-user'連接的插件/ userPlugin/config/doctrine/schema.yml。我的目標是強制項目的databases.yml包含'store-rw-user'的連接,這樣項目將負責設置單獨的用戶連接。Symfony 1.4 - Doctrine - 自定義插件 - 未知連接

但是,當我嘗試訪問與插件相關的代碼時,我總是得到:Doctrine_Manager_Exception Unknown connection: store-rw-user

這裏是插件模式文件的相關片段:

# plugins/userPlugin/config/doctrine/schema.yml 
connection: store-rw-user 

User: 
    tableName: user 
    actAs: [Timestampable]  

這裏是BaseUser.class.php(做一個模型構建時產生)的相關片段:

<?php 
// lib/model/doctrine/userPlugin/base/BaseUser.class.php 

// Connection Component Binding 
Doctrine_Manager::getInstance()->bindComponent('User', 'store-rw-user'); 

.... 

最後項目的databases.yml裏文件的相關片段:

# config/databases.yml 
all: 
    store-rw-user: 
    class: sfDoctrineDatabase 
    param: 
    .... 

從一開始,一切看起來配置正確。插件schema.yml導致基類綁定正確的數據庫連接,該連接存在於項目的databases.yml文件中。但是,我遇到了上述問題。在我開始嘗試通過插件initialize()方法手動操作doctrine連接管理器之前,我想知道是否有另一種解決此問題的方法。

- 更新 -

經過進一步調查,看來sfDatabaseManager知道'存儲-RW-用戶的連接,但是,Doctrine_Manager不是。起初我以爲這可能是由於我在主項目配置文件中添加插件的順序,但它隻影響sfDatabaseManager是否具有連接意識,但爲了完整起見,這裏是項目配置文件的片段:

// config/ProjectConfiguration.class.php 
class ProjectConfiguration extends sfProjectConfiguration 
{ 
    .... 

    public function setup() 
    { 
     .... 

     $this->enablePlugins(
      array(
       'sfDoctrinePlugin', 
       'userPlugin' 
      ) 
     ); 
    } 
} 

而就在如此重要的情況下,這裏是爲userPlugin的app.yml:

# plugins/userPlugin/config/app.yml 
# This entry was needed so build-model was executed, the plugin schema file would be pulled in for build as well 
all: 
    userPlugin: 
    config_dir: %SF_PLUGINS_DIR%/userPlugin/config 
    recursive: true 

這裏是代碼的混亂段,在那裏我有機會獲得「商店RW-用戶通過sfDatabaseManager連接,但不是Doctrine_Manager,這是一個問題,因爲錯誤是從Doctrine_Manager引發的,而不是sfDatabaseMana GER:

// plugins/userPlugin/config/userPluginConfiguration.class.php 
class userPluginConfiguration extends sfPluginConfiguration 
{ 
    public function initialize() 
    { 
     parent::initialize(); 

     var_dump(Doctrine_Manager::getInstance()->getConnections()); 

     $config = ProjectConfiguration::getActive(); 

     $manager = new sfDatabaseManager($config); 

     var_dump($manager->getDatabase('store-rw-user')); 

     exit; 
    } 
} 

而且結果:

array (size=0) 
    empty 

object(sfDoctrineDatabase)[53] 
    protected '_doctrineConnection' => 
    object(Doctrine_Connection_Mysql)[55] 
     protected 'driverName' => string 'Mysql' (length=5) 
     protected 'dbh' => null 
     protected 'tables' => 
     array (size=0) 
      empty 
     protected '_name' => string 'store-rw-user' (length=13) 
.... 

不知道發生了什麼事,試圖尋找其他的插件,看看他們如何應對,他們沒有任何數據庫引用,我能找到。

+1

您的databases.yml中沒有縮進錯誤:'store-rw-user'與'class'位於同一級別。這是你的問題或你的databases.yml錯字嗎? – j0k

+0

良好的捕獲,這只是在問題上格式不正確,databases.yml正確隔開。 –

回答

2

在添加了一些調試代碼來選擇源文件(Doctrine_Manager)之後,我終於在initialize()方法的上述代碼片段中看到,通過簡單配置sfDatabaseManager,doctrine就知道了連接。總之,我的方法結束了看起來像這樣:

class userPluginConfiguration extends sfPluginConfiguration 
{ 
    public function initialize() 
    { 
     parent::initialize(); 

     // Don't ask me why, without this the needed db connection never gets initialized and plugin craps out 
     $manager = new sfDatabaseManager(ProjectConfiguration::getActive()); 
    } 
} 

而且,神奇,學說現在知道該項目的databases.yml裏文件中的所有連接。對我來說似乎很弱,我不得不明確地打這個電話,但至少我可以繼續進行一些編碼。

相關問題