Snc\RedisBundle\DependencyInjection\SncRedisExtension::loadPredisClient PHP Method

loadPredisClient() protected method

Loads a redis client using predis.
protected loadPredisClient ( array $client, ContainerBuilder $container )
$client array A client configuration
$container Symfony\Component\DependencyInjection\ContainerBuilder A ContainerBuilder instance
    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']));
    }