1

多くのサイトをホストする Symfony2 サイトに取り組んでおり、各サイトには独自のデータベースがあります。リフレクションを使用して「クライアント」エンティティ マネージャーの接続パラメーター (ユーザー名、パスワード、データベース名) を変更するサービスを実装しました。FOSUserBundle がその認証サービスを呼び出す前に、このサービスをトリガーする方法がわかりません。Symfony2 Request イベントリスナーを作成しようとしましたが、うまくいかないようです:

class RequestListener {
    private $clientSiteContext;

    function __construct($clientSiteContext) {
        $this->clientSiteContext = $clientSiteContext;
    }

    public function onKernelRequest(GetResponseEvent $event) {
        if ($event->getRequestType() == HttpKernel::MASTER_REQUEST) {
            $this->clientSiteContext->resetClientEntityManager();
        }
    }
}

resetClientEntityManager() の実装

public function resetClientEntityManager() {
    /** @var $doctrine \Doctrine\Bundle\DoctrineBundle\Registry */
    $doctrine = $this->container->get('doctrine');

    $dbConfig = $this->getConnectionParams();
    $dbalServiceName = sprintf('doctrine.dbal.%s_connection', 'client');
    $clientEmName = 'client';

    $connection = $this->container->get($dbalServiceName);
    $connection->close();

    $refConn = new \ReflectionObject($connection);
    $refParams = $refConn->getProperty('_params');
    $refParams->setAccessible('public');

    $params = $refParams->getValue($connection);
    $params['dbname'] = $dbConfig['dbname'];
    $params['user'] = $dbConfig['user'];
    $params['host'] = $dbConfig['host'];
    $params['password'] = $dbConfig['password'];
    $params['driver'] = $dbConfig['driver'];
    $params['charset'] = 'UTF8';

    $refParams->setAccessible('private');
    $refParams->setValue($connection, $params);

    $doctrine->resetEntityManager($clientEmName);
}

このリスナーがページ要求ごとに 1 回呼び出され、FOSUserBundle が使用するエンティティ マネージャーに影響を与える方法を教えてもらえますか?

4

1 に答える 1

2

これは、カーネル イベントの前に行う必要があります。おそらく、AppKernel ( app/AppKernel.php) 自体のどこかに配置するのが最適な場所です。

おそらく getBundles() に取り込むか、次のようなものを追加できます。

public function boot() {
    parent::boot();
    resetClientEntityManager();
}

私はそれをテストしていませんが、うまくいくはずです。boot() はコンテナーが初期化される関数であるため、コンテナーが初期化された直後、他の何かが何かを行う前に切り替えを行う必要があります。

于 2012-12-13T04:30:07.857 に答える