我有一个名为“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 对象添加到bundle扩展类中的 ServiceManager (这是一项服务)吗?
这就是捆绑包的配置如下:
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));
}
}
这是否合适?
答案 0 :(得分:1)
要根据配置创建服务,您需要创建compiler pass和enable。
编译器通行证让您有机会操纵其他服务 已在服务容器中注册的定义。
答案 1 :(得分:1)
我想我可能已经解决了这个问题,我做了一个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));
}
}