gpt4 book ai didi

symfony - 动态更改 FOSUserBundle 的服务参数值

转载 作者:行者123 更新时间:2023-12-02 14:08:53 26 4
gpt4 key购买 nike

我询问了using multiple entity manager for FOSUserBundle之前,事实证明 FOSUserBundle 已经(部分)支持了这一点。我需要做的就是在 model_manager_name 参数中指定我想要使用的连接/管理器,如所述 here

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 的连接。对于我的应用程序的逻辑,这可以通过我的 Controller 轻松完成,因为我可以使用如下所示的内容;

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

但对于登录部分来说,事情就没那么容易了。 FOSUserBundle 作为服务容器运行,我不知道在哪里/如何动态更改 model_manager_name 的值。我确实知道,在 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';
// .................

有什么想法吗?

最佳答案

配置存储在容器内,确切地说是存储在 fos_user.model_manager_name 中。

您可以编写编译器 channel 。这将在卡住容器之前执行,这是您可以更改容器的最后一个位置,也是基于其他服务更改容器的位置。

您的编译器传递将如下所示:

// 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', ...);
}
}
}

了解有关编译器传递的更多信息 the docs或在 this great blog post作者:理查德·米勒。

关于symfony - 动态更改 FOSUserBundle 的服务参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15241218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com