Symfony 基于包扩展类内的配置更改服务(ClientManager)

Symfony 基于包扩展类内的配置更改服务(ClientManager),symfony,Symfony,我有一个名为“ApiBundle”的包。在这个包中,我有一个类“ServiceManager”,这个类负责检索一个特定的服务对象。这些服务对象需要根据某些配置创建,因此在我的bundle扩展类中的这段代码之后: $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); $loader = new Loader\YamlFileLoader($

我有一个名为“ApiBundle”的包。在这个包中,我有一个类“ServiceManager”,这个类负责检索一个特定的服务对象。这些服务对象需要根据某些配置创建,因此在我的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...
我在处理配置后立即创建这些服务对象,如下所示:

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

    $manager = $container->get($this->getAlias() . '.service_manager');
    $manager->add($service);
}
不幸的是,这不起作用,可能是因为容器尚未编译。因此,我尝试通过以下方式添加这些服务对象:

$manager = $container->getDefinition($this->getAlias() . '.service_manager');
$manager->addMethodCall('add', array($service));
但同样,这会引发以下异常:
RuntimeException:如果参数是对象或资源,则无法转储服务容器。

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

捆绑包的配置如下所示:

api_client:
    services:
        some_api:
            endpoint: http://api.yahoo.com
        some_other_api:
            endpoint: http://api.google.com
每个“服务”都将是一个独立的服务对象

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

斯特芬

编辑


我想我可能已经解决了这个问题,我做了一个编译器传递,用以下代码操作容器:

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

这是否合适?

根据需要创建的配置创建服务,并对其进行修改

编译器传递给您一个操作其他服务的机会 已在服务容器中注册的定义


我想我可能已经解决了这个问题,我做了一个编译器传递,用以下代码操作容器:

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

是的,编译器密码正是您所需要的,移动您的
EDIT
部分以回答并接受它:)