1

我正在构建一个自定义插件,它由我试图与插件紧密耦合的模式组成。例如,我有一个 plugins/userPlugin/config/doctrine/schema.yml 引用了一个“store-rw-user”连接。我的目标是强制项目的 databases.yml 包含“store-rw-user”的连接,这样项目将负责设置单独的用户连接。

但是,当我尝试访问与插件相关的代码时,我不断收到: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() 方法手动操作教义连接管理器之前,我想知道是否有其他方法可以解决此问题。

- 更新 -

经过进一步调查,sfDatabaseManager 似乎知道“store-rw-user”连接,但是,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

这是令人困惑的代码片段,我可以通过 sfDatabaseManager 而不是 Doctrine_Manager 访问“store-rw-user”连接,这是一个问题,因为错误是从 Doctrine_Manager 而不是 sfDatabaseManager 抛出的:

// 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)
....

不知道发生了什么,尝试查看其他插件以了解它们的处理方式,并且它们没有我能找到的任何数据库引用。

4

1 回答 1

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 文件中的所有连接。对我来说似乎很弱,我必须明确地进行这个调用,但至少我可以继续进行一些编码。

于 2012-11-30T01:09:42.770 回答