configuration data for adapter. * @return mixed null when adding configuration and an array of configuration data when reading. * @throws \BadMethodCallException When trying to modify an existing config. */ public static function config($key, $config = null) { // Read config. if ($config === null && is_string($key)) { return isset(static::$_config[$key]) ? static::$_config[$key] : null; } if ($config === null && is_array($key)) { foreach ($key as $name => $settings) { static::config($name, $settings); } return; } if (isset(static::$_config[$key])) { throw new BadMethodCallException(sprintf('Cannot reconfigure existing key "%s"', $key)); } if (is_array($config)) { $config = static::parseDsn($config); } elseif ($config === null && is_array($key)) { foreach ($key as $name => $settings) { $key[$name] = static::parseDsn($settings); } } elseif (is_object($config)) { $config = ['className' => $config]; } if (isset($config['engine']) && empty($config['className'])) { $config['className'] = $config['engine']; unset($config['engine']); } static::$_config[$key] = $config; } /** * Drops a constructed adapter. * * If you wish to modify an existing configuration, you should drop it, * change configuration and then re-add it. * * If the implementing objects supports a `$_registry` object the named configuration * will also be unloaded from the registry. * * @param string $config An existing configuation you wish to remove. * @return bool success of the removal, returns false when the config does not exist. */ public static function drop($config) { if (!isset(static::$_config[$config])) { return false; } if (isset(static::$_registry)) { static::$_registry->unload($config); } unset(static::$_config[$config]); return true; } /** * Returns an array containing the named configurations * * @return array Array of configurations. */ public static function configured() { return array_keys(static::$_config); } /** * Parses a DSN into a valid connection configuration * * This method allows setting a DSN using formatting similar to that used by PEAR::DB. * The following is an example of its usage: * * {{{ * $dsn = 'Cake\Database\Driver\Mysql://localhost/database?className=Cake\Database\Connection'; * $config = ConnectionManager::parseDsn($dsn); * * $dsn = 'Cake\Database\Driver\Mysql://localhost:3306/database?className=Cake\Database\Connection'; * $config = ConnectionManager::parseDsn($dsn); * * $dsn = 'Cake\Database\Connection://localhost:3306/database?driver=Cake\Database\Driver\Mysql'; * $config = ConnectionManager::parseDsn($dsn); * * $dsn = 'Cake\Log\Engine\FileLog://?types=notice,info,debug&file=debug&path=LOGS'; * $config = Log::parseDsn($dsn); * * $dsn = 'Mail://user:secret@localhost:25?timeout=30&client=null&tls=null'; * $config = Email::parseDsn($dsn); * * $dsn = 'File:///'; * $config = Cache::parseDsn($dsn); * * $dsn = 'File://?prefix=myapp_cake_core_&serialize=true&duration=+2 minutes&path=/tmp/persistent/'; * $config = Cache::parseDsn($dsn); * * }} * * For all classes, the value of `scheme` is set as the value of both the `className` and `driver` * unless they have been otherwise specified. * * Note that querystring arguments are also parsed and set as values in the returned configuration. * * @param array $config An array with a `url` key mapping to a string DSN * @return mixed null when adding configuration and an array of configuration data when reading. */ public static function parseDsn($config = null) { if (!is_array($config) || !isset($config['url'])) { return $config; } $driver = null; $dsn = $config['url']; if (preg_match("/^([\w\\\]+)/", $dsn, $matches)) { $scheme = $matches[1]; $dsn = preg_replace("/^([\w\\\]+)/", 'file', $dsn); } $parsed = parse_url($dsn); if ($parsed === false) { return $config; } $parsed['scheme'] = $scheme; $query = ''; if (isset($parsed['query'])) { $query = $parsed['query']; unset($parsed['query']); } parse_str($query, $queryArgs); foreach ($queryArgs as $key => $value) { if ($value === 'true') { $queryArgs[$key] = true; } elseif ($value === 'false') { $queryArgs[$key] = false; } elseif ($value === 'null') { $queryArgs[$key] = null; } } if (isset($parsed['user'])) { $parsed['username'] = $parsed['user']; } if (isset($parsed['pass'])) { $parsed['password'] = $parsed['pass']; } unset($config['url']); $config = array_merge($config, $parsed, $queryArgs); unset($config['user'], $config['pass']); if (empty($config['className']) && method_exists(get_called_class(), 'getClassMap')) { $classMap = static::getClassMap(); $config['className'] = $config['scheme']; if (isset($classMap[$config['scheme']])) { $config['className'] = $classMap[$config['scheme']]; } } return $config; } }