読者です 読者をやめる 読者になる 読者になる

fuelPHP の db.php で default 以外の場合に Database type not defined in "xxx" configuration or "xxx" configuration does not exist

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);  

これでいーのかな・・・?