我正在构建一个自定义插件,它由我试图与插件紧密耦合的模式组成。例如,我有一个 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)
....
不知道发生了什么,尝试查看其他插件以了解它们的处理方式,并且它们没有我能找到的任何数据库引用。