1

プラグインと緊密に結合しようとしているスキーマで構成されるカスタムプラグインを構築しています。たとえば、「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)
....

何が起こっているのかわからないので、他のプラグインを調べて、それらがどのように処理されるかを確認してみました。それらには、私が見つけたデータベース参照がありません。

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());
    }
}

そして、魔法のように、doctrineはプロジェクトのdatabases.ymlファイル内のすべての接続を認識していました。この呼び出しを明示的に行わなければならないことは私には弱いようですが、少なくともいくつかのコーディングを続けることができます。

于 2012-11-30T01:09:42.770 に答える