private function loadAmqpTransport(array $config, ContainerBuilder $container)
{
$this->loader->load('transport/amqp/amqp.xml');
$this->loader->load(sprintf('transport/amqp/%s.xml', $config['driver']));
if (class_exists('JMS\\AopBundle\\JMSAopBundle')) {
$this->loader->load('transport/amqp/tracer.xml');
}
$camelizeKey = function (array $config) {
$camelized = [];
foreach ($config as $key => $value) {
$camelized[lcfirst(ContainerBuilder::camelize($key))] = $value;
}
return $camelized;
};
$definitions = [];
foreach ($config['connections'] as $name => $connectionConfig) {
$exchanges = $connectionConfig['exchanges'];
unset($connectionConfig['exchanges']);
$queues = $connectionConfig['queues'];
unset($connectionConfig['queues']);
$amqp = new DefinitionDecorator('event_band.transport.amqp.definition');
$amqp->addMethodCall('connection', [$camelizeKey($connectionConfig)]);
foreach ($exchanges as $exchange => $exchangeConfig) {
$exchangeType = $exchangeConfig['type'];
unset($exchangeConfig['type']);
$amqp->addMethodCall($exchangeType . 'Exchange', [$exchange, $camelizeKey($exchangeConfig)]);
}
foreach ($queues as $queue => $queueConfig) {
$amqp->addMethodCall('queue', [$queue, $camelizeKey($queueConfig)]);
}
$definitionId = self::getTransportDefinitionId('amqp', $name);
$container->setDefinition($definitionId, $amqp);
$definitions[$name] = $definitionId;
$connection = new DefinitionDecorator('event_band.transport.amqp.connection_definition');
$connection->setFactoryService($definitionId);
$connectionId = self::getAmqpConnectionDefinitionId($name);
$container->setDefinition($connectionId, $connection);
$factory = new DefinitionDecorator(sprintf('event_band.transport.amqp.connection_factory.%s', $config['driver']));
$factory->addMethodCall('setDefinition', [new Reference($connectionId)]);
$container->setDefinition(self::getAmqpLibConnectionFactoryId($name), $factory);
$driver = new DefinitionDecorator('event_band.transport.amqp.driver.' . $config['driver']);
$driver->replaceArgument(0, new Reference($this->getAmqpLibConnectionFactoryId($name)));
$container->setDefinition($this->getAmqpDriverId($name), $driver);
$configurator = new DefinitionDecorator('event_band.transport.amqp.configurator');
$configurator->replaceArgument(0, new Reference($this->getAmqpDriverId($name)));
$container->setDefinition(self::getTypedTransportConfiguratorId('amqp', $name), $configurator);
$container->getDefinition(self::getTransportConfiguratorId())->addMethodCall('registerConfigurator', ['amqp.' . $name, new Reference(self::getTypedTransportConfiguratorId('amqp', $name))]);
}
$container->setParameter('event_band.transport_definitions', array_merge($container->getParameter('event_band.transport_definitions'), ['amqp' => $definitions]));
foreach ($config['converters'] as $name => $converterConfig) {
$definition = new DefinitionDecorator('event_band.transport.amqp.converter.serialize');
$definition->replaceArgument(0, new Reference(self::getSerializerId($converterConfig['parameters']['serializer'])));
$container->setDefinition(self::getAmqpConverterId($name), $definition);
}
}