fuelPHP の db.php で default 以外の場合に
以下のエラーが出た。
Database type not defined in "xxx" configuration or "xxx" configuration does not exist
結論から言うと、以下の2点で問題があった。
1.db.php の設定方法にtypeを設定しなかった。
2.DB接続前に Config::load() で設定ファイルを読み込んでいた。
まずは
1.db.php の設定方法にtypeを設定しなかった。
について。
エラーメッセージからも分かるように、
以下のようにDB設定の type が存在しなかった。
<?php 'xxx' => array( 'connection' => array( 'dsn' => 'mysql:host=localhost;dbname=db1', 'username' => 'root', 'password' => 'pass', ), ),
default の場合は /core/config/db.php で設定してあるので、
問題ない。
なので、以下のように type を追加して正常に動きました。
<?php 'xxx' => array( 'type' => 'pdo', 'connection' => array( 'dsn' => 'mysql:host=localhost;dbname=db1', 'username' => 'root', 'password' => 'pass', ), ),
次に
2.DB接続前に Config::load() で設定ファイルを読み込んでいた。
について。
fuelのDB接続では /core/classes/database/connection.php の
instance() で以下のように設定ファイルを読み込んでいる。
<?php \Config::load('db', true);
これ自体は問題ない。
ただ、今回は上記のDB接続前に設定ファイルを読み込んで
DB情報を取得する必要があったので、
以下のコードを実行していた。
<?php Config::load('db');
つまり、
Config::load('db'); を実行してから、
\Config::load('db', true); を実行したことになる。
これがダメだった。
Config::load('db'); は第2引数が null だと設定がルートの設定とマージされ、
true の場合は第1引数で指定した名前がグループ名になる。
http://fuelphp.jp/docs/1.5/classes/config.html#/method_load
今回は定義した全DB情報を取得するために
設定ファイルを以下の様に db という配列を挟んだ特殊な構造にしていた。
<?php return array( 'db' => array( 'db1_master' => array( 'type' => 'pdo', 'connection' => array( 'dsn' => 'mysql:host=localhost;dbname=db1', 'username' => 'root', 'password' => 'pass', ), ), 'db1_slave_1' => array( 'type' => 'pdo', 'connection' => array( 'dsn' => 'mysql:host=localhost;dbname=db1', 'username' => 'root', 'password' => 'pass', ), ), ) );
この db で階層が1つずれた設定ファイルを取得する際に
ルートの設定とマージされた結果、
設定ファイルが上手く動かなかったのかなと・・・。
なので、DB接続前の設定ファイル読み込みを
以下のように修正することで動作しました。
<?php Config::load('db', true);
これでいーのかな・・・?