【问题标题】:Alter service (ClientManager) based on configuration inside bundle extension class根据捆绑扩展类中的配置更改服务(ClientManager)
【发布时间】:2013-11-30 20:18:14
【问题描述】:

我有一个名为:“ApiBundle”的包。在这个包中,我有“ServiceManager”类,这个类负责检索特定的Service 对象。那些 Service 对象需要根据一些配置来创建,所以在我的 bundle 扩展类中的这段代码之后:

$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');

// Create Service objects...

我在处理完配置后立即创建那些 Service 对象,如下所示:

foreach ($services as $name => $service) {
    $service = new Service();
    $service->setName($name);

    $manager = $container->get($this->getAlias() . '.service_manager');
    $manager->add($service);
}

不幸的是,这不起作用,可能是因为容器尚未编译。所以我尝试通过以下方式添加那些 Service 对象:

$manager = $container->getDefinition($this->getAlias() . '.service_manager');
$manager->addMethodCall('add', array($service));

但同样,这会引发以下异常:RuntimeException: Unable to dump a service container if a parameter is an object or a resource.

我似乎无法掌握如何正确使用服务容器。有人知道我如何将这些 Service 对象添加到捆绑扩展类中的 ServiceManager (这是一项服务)吗?

bundle 的配置如下所示:

api_client:
    services:
        some_api:
            endpoint: http://api.yahoo.com
        some_other_api:
            endpoint: http://api.google.com

每个“服务”都是一个单独的服务对象。

我希望我解释得足够好,如果我的英语不正确,我很抱歉。

史蒂芬

编辑

我想我可能已经解决了这个问题,我制作了一个 Compiler Pass 来使用以下内容操作那里的容器:

public function process(ContainerBuilder $container)
{
    $services = $container->getParameter('mango_api.services');

    foreach ($services as $name => $service) {
        $clientManager = $container->getDefinition('mango_api.client_manager');

        $client = new Definition('Mango\Bundle\ApiBundle\Client\Client', array($name, 'client', 'secret'));
        $container->setDefinition('mango_api.client.' .$name, $client);

        $clientManager->addMethodCall('add', array($client));
    }
}

这样合适吗?

【问题讨论】:

  • 是的,编译器通行证正是您所需要的,移动您的EDIT 部分回答并接受它:)

标签: symfony


【解决方案1】:

要根据配置创建服务,您需要创建compiler passenable

编译器通行证让您有机会操纵其他服务 已在服务容器中注册的定义。

【讨论】:

    【解决方案2】:

    我想我可能已经解决了这个问题,我制作了一个 Compiler Pass 来使用以下内容操作那里的容器:

    public function process(ContainerBuilder $container)
    {
        $services = $container->getParameter('mango_api.services');
    
        foreach ($services as $name => $service) {
            $clientManager = $container->getDefinition('mango_api.client_manager');
    
            $client = new Definition('Mango\Bundle\ApiBundle\Client\Client', array($name, 'client', 'secret'));
            $client->setPublic(false);
    
            $container->setDefinition('mango_api.client.' .$name, $client);
    
            $clientManager->addMethodCall('add', array($client));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2011-11-27
      • 2012-09-27
      相关资源
      最近更新 更多