diff --git a/framework/db/Connection.php b/framework/db/Connection.php index 738445a..370a4c7 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -112,7 +112,7 @@ use yii\caching\CacheInterface; * * The [[dsn]] property can be defined via configuration array: * - * * ```php + * ```php * 'components' => [ * 'db' => [ * '__class' => \yii\db\Connection::class, @@ -171,13 +171,27 @@ class Connection extends Component const EVENT_ROLLBACK_TRANSACTION = 'rollbackTransaction'; /** - * @var string the Data Source Name, or DSN, contains the information required to connect to the database. + * @var string|array the Data Source Name, or DSN, contains the information required to connect to the database. * Please refer to the [PHP manual](http://php.net/manual/en/pdo.construct.php) on * the format of the DSN string. * * For [SQLite](http://php.net/manual/en/ref.pdo-sqlite.connection.php) you may use a [path alias](guide:concept-aliases) * for specifying the database path, e.g. `sqlite:@app/data/db.sql`. * + * Since version 2.1.0 an array can be passed to contruct a DSN string. + * The `driver` array key is used as the driver prefix of the DSN, + * all further key-value pairs are rendered as `key=value` and concatenated by `;`. For example: + * + * ```php + * 'dsn' => [ + * 'driver' => 'mysql', + * 'host' => '127.0.0.1', + * 'dbname' => 'demo' + * ], + * ``` + * + * Will result in the DSN string `mysql:host=127.0.0.1;dbname=demo`. + * * @see charset */ public $dsn; @@ -444,6 +458,7 @@ class Connection extends Component */ private $_queryCacheInfo = []; + /** * {@inheritdoc} */ @@ -452,6 +467,7 @@ class Connection extends Component if (is_array($this->dsn)) { $this->dsn = $this->buildDSN($this->dsn); } + parent::init(); } /** @@ -1146,18 +1162,17 @@ class Connection extends Component private function buildDSN(array $config) { if (isset($config['driver'])) { - $parts = []; $driver = $config['driver']; unset($config['driver']); + $parts = []; foreach ($config as $key => $value) { $parts[] = "$key=$value"; } return "$driver:" . implode(';', $parts); - } else { - throw new InvalidConfigException("Connection 'driver' must be set."); } + throw new InvalidConfigException("Connection DSN 'driver' must be set."); } /**