get(AppOptions::class); $adapter = $this->getAdapter($container); $adapter->setNamespace((string) $appOptions); return $adapter; } private function getAdapter(ContainerInterface $container): Cache\CacheProvider { // Try to get the adapter from config $config = $container->get('config'); if (isset($config['cache']['adapter']) && contains(self::VALID_CACHE_ADAPTERS, $config['cache']['adapter'])) { return $this->resolveCacheAdapter($config['cache']); } // If the adapter has not been set in config, create one based on environment return env('APP_ENV', 'pro') === 'pro' ? new Cache\ApcuCache() : new Cache\ArrayCache(); } private function resolveCacheAdapter(array $cacheConfig): Cache\CacheProvider { switch ($cacheConfig['adapter']) { case Cache\ArrayCache::class: case Cache\ApcuCache::class: return new $cacheConfig['adapter'](); case Cache\FilesystemCache::class: case Cache\PhpFileCache::class: return new $cacheConfig['adapter']($cacheConfig['options']['dir'] ?? sys_get_temp_dir()); case Cache\MemcachedCache::class: $cache = new Cache\MemcachedCache(); $cache->setMemcached($this->buildMemcached($cacheConfig)); return $cache; default: return new Cache\ArrayCache(); } } private function buildMemcached(array $cacheConfig): Memcached { $memcached = new Memcached(); $servers = $cacheConfig['options']['servers'] ?? []; foreach ($servers as $server) { $this->addMemcachedServer($memcached, $server); } return $memcached; } private function addMemcachedServer(Memcached $memcached, array $server): void { if (! isset($server['host'])) { return; } $port = (int) ($server['port'] ?? self::DEFAULT_MEMCACHED_PORT); $memcached->addServer($server['host'], $port); } }