protected function loadPredisClient(array $client, ContainerBuilder $container)
{
if (null === $client['options']['cluster']) {
unset($client['options']['cluster']);
}
// predis connection parameters have been renamed in v0.8
$client['options']['async_connect'] = $client['options']['connection_async'];
$client['options']['timeout'] = $client['options']['connection_timeout'];
$client['options']['persistent'] = $client['options']['connection_persistent'];
$client['options']['exceptions'] = $client['options']['throw_errors'];
unset($client['options']['connection_async']);
unset($client['options']['connection_timeout']);
unset($client['options']['connection_persistent']);
unset($client['options']['throw_errors']);
$connectionAliases = array();
$connectionCount = count($client['dsns']);
foreach ($client['dsns'] as $i => $dsn) {
/** @var \Snc\RedisBundle\DependencyInjection\Configuration\RedisDsn $dsn */
if (!($connectionAlias = $dsn->getAlias())) {
$connectionAlias = 1 === $connectionCount ? $client['alias'] : $client['alias'] . ($i + 1);
}
$connectionAliases[] = $connectionAlias;
$connection = $client['options'];
$connection['logging'] = $client['logging'];
$connection['alias'] = $connectionAlias;
if (null !== $dsn->getSocket()) {
$connection['scheme'] = 'unix';
$connection['path'] = $dsn->getSocket();
} else {
$connection['scheme'] = 'tcp';
$connection['host'] = $dsn->getHost();
$connection['port'] = $dsn->getPort();
}
if (null !== $dsn->getDatabase()) {
$connection['database'] = $dsn->getDatabase();
}
$connection['password'] = $dsn->getPassword();
$connection['weight'] = $dsn->getWeight();
$this->loadPredisConnectionParameters($client['alias'], $connection, $container);
}
// TODO can be shared between clients?!
$profileId = sprintf('snc_redis.client.%s_profile', $client['alias']);
$profileDef = new Definition(get_class(\Predis\Profile\Factory::get($client['options']['profile'])));
// TODO get_class alternative?
$profileDef->setPublic(false);
if (null !== $client['options']['prefix']) {
$processorId = sprintf('snc_redis.client.%s_processor', $client['alias']);
$processorDef = new Definition('Predis\\Command\\Processor\\KeyPrefixProcessor');
$processorDef->setArguments(array($client['options']['prefix']));
$container->setDefinition($processorId, $processorDef);
$profileDef->addMethodCall('setProcessor', array(new Reference($processorId)));
}
$container->setDefinition($profileId, $profileDef);
$client['options']['profile'] = new Reference($profileId);
$optionId = sprintf('snc_redis.client.%s_options', $client['alias']);
$optionDef = new Definition($container->getParameter('snc_redis.client_options.class'));
$optionDef->setPublic(false);
$optionDef->addArgument($client['options']);
$container->setDefinition($optionId, $optionDef);
$clientDef = new Definition($container->getParameter('snc_redis.client.class'));
$clientDef->addTag('snc_redis.client', array('alias' => $client['alias']));
if (1 === $connectionCount) {
$clientDef->addArgument(new Reference(sprintf('snc_redis.connection.%s_parameters.%s', $connectionAliases[0], $client['alias'])));
} else {
$connections = array();
foreach ($connectionAliases as $alias) {
$connections[] = new Reference(sprintf('snc_redis.connection.%s_parameters.%s', $alias, $client['alias']));
}
$clientDef->addArgument($connections);
}
$clientDef->addArgument(new Reference($optionId));
$container->setDefinition(sprintf('snc_redis.%s', $client['alias']), $clientDef);
$container->setAlias(sprintf('snc_redis.%s_client', $client['alias']), sprintf('snc_redis.%s', $client['alias']));
}