3

以前、 FOSUserBundleに複数のエンティティマネージャーを使用することについて質問しましたが、FOSUserBundleが(部分的に)それをサポートしていることがわかりました。ここmodel_manager_nameで説明するように、必要なのは、パラメーターで使用する接続/マネージャーを指定することだけです。

fos_user:
# ........
    model_manager_name: account1

サンプルapp/config / config.yml

これにより、FOSUserBundleはaccount1接続を使用し、その接続のデータベース内のユーザー情報を使用します。

doctrine:
dbal:
    default_connection:       default
    connections:
    account2:
        dbname:           account2
        user:             account2
        password:         password2
        driver:   pdo_mysql
        host:     localhost
        port:     ~
        charset:  UTF8
    account1:
        dbname:           account1
        user:             account1
        password:         password1
        driver:   pdo_mysql
        host:     localhost
        port:     ~
        charset:  UTF8
    default:
        dbname:           account
        user:             account
        password:         password
        driver:   pdo_mysql
        host:     localhost
        port:     ~
        charset:  UTF8

私のアプリでは、ユーザーが(たとえば)http://myapp.com/a/account1にアクセスすると、アプリはaccount1接続を使用し、http://myapp.com/a/account2にアクセスaccount2するとの接続を使用する必要があります。 。私のアプリケーションのロジックでは、次のようなものを使用できるため、これはコントローラーから簡単に実行できます。

$em = $this->get('doctrine')->getManager('account2');
$repository = $this->get('doctrine')->getRepository($class, 'account2')

ただし、ログイン部分については、それほど簡単ではありません。model_manager_nameFOSUserBundleはサービスコンテナとして実行されますが、の値を動的に変更する場所/方法がわかりません。FOS\UserBundle\DependencyInjection\FOSUserExtension私はその値を次のように手動で変更できることを知っています。

class FOSUserExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
    $processor = new Processor();
    $configuration = new Configuration();

    $config = $processor->processConfiguration($configuration, $configs);

    $config['model_manager_name'] = 'account2';
    // .................

何かご意見は?

4

1 に答える 1

5

fos_user.model_manager_name構成は、正確にはコンテナ内に保存されます。

コンパイラ パスを記述できます。これはコンテナを凍結する直前に実行され、コンテナを変更できる最後の場所であり、他のサービスに基づいてコンテナを変更する場所です。

コンパイラ パスは次のようになります。

// src/Acme/DemoBundle/DependencyInjection/Compiler/ChangeModelManagerPass.php
namespace Acme\DemoBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class ChangeModelManagerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $request = $container->get('request');
        $uri = $request->getUri();

        // check if the uri matches some pattern which will cause a change in the
        // `model_manager_name` setting
        if (...) {
            // ... do some stuff to get the correct model manager name

            // set the setting
            $container->setParameter('fos_user.model_manager_name', ...);
        }
    }
}

コンパイラ パスの詳細については、ドキュメントまたはRichard Miller によるこのすばらしいブログ記事を参照してください。

于 2013-03-06T08:52:10.947 に答える