プラグインと緊密に結合しようとしているスキーマで構成されるカスタムプラグインを構築しています。たとえば、「store-rw-user」接続を参照するplugins / userPlugin / config / doctrine/schema.ymlがあります。私の目標は、プロジェクトの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()メソッドを使用してDoctrine接続マネージャーを手動で操作しようとする前に、この問題に対する別のアプローチがあるかどうかを知りたいです。
- アップデート -
さらに調査したところ、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を介して「store-rw-user」接続にアクセスできますが、Doctrine_Managerにはアクセスできません。これは、エラーがsfDatabaseManagerではなくDoctrine_Managerからスローされるために問題になります。
// 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)
....
何が起こっているのかわからないので、他のプラグインを調べて、それらがどのように処理されるかを確認してみました。それらには、私が見つけたデータベース参照がありません。