Help us understand the problem. What is going on with this article?

🍰【CakePHP2】複数あるデータベース設定ファイル「database.php」を指定して情報読み込み

環境

PHP 7.2.21
CakePHP 2.10.18

内容

本来のCakePHPは単一のデータベース接続の定義ファイル「database.php」にpublic変数として接続情報を配列で格納しそれを縦に並べて読み込みを行う

色々あって別々のディレクトリに「database.php」を複数置いた環境にて動的にDBを切り替えるため設定ファイルを読み込まなければならない状態になってしまった

やったこと

読み込み用のBehavorを新規追加し、それもModelに読み込ませる
その後Behaviorを読んだModelにControllerからファイル名を渡して別の「database.php」情報を読み込む

Model/Behavior/HogeBehavior.php
<?php
/**
 * Hoge behavior
 *
 */
class HogeBehavior extends ModelBehavior {
    /**
     * 別のDB情報を環境database.phpから読込み
     *
     *@param Model  $model
     *@param string $dbFileName 読み込みたいdatabase.phpファイル名
     *@return array 取得情報
     */
    public function readDatabaseValue(Model $model, string $dbFileName) {
        $cnt = 0;
        $flg = false;

        // 読み込みたいdatabase.phpのフルパス
        $filePath = ROOT . DS . 'app' . DS . 'Config' . DS . $dbFileName;
        if (file_exists($filePath)) {
            $fdata = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($fdata as $line) {
                $line = preg_replace("/( |,|')/", "", $line);
                $data = explode('=>', $line);
                if (strpos($line, 'public') !== false) {
                    $cnt++;
                    $flg = false;
                }
                if ($cnt == 1 && $flg == true) {
                    $result[$data[0]] = $data[1];
                }
                $flg = true;
            }
        }

        return [
            'datasource' => $result['datasource'],
            'persistent' => $result['persistent'] === 'true' ? true : false,
            'host'       => $result['host'],
            'login'      => $result['login'],
            'password'   => $result['password'],
            'database'   => $result['database'],
            'prefix'     => $result['prefix'],
            'encoding'   => $result['encoding'],
        ];
    }
}
Model/Hoge.php
<?php
class Hoge extends AppModel {
    public $useTable    = 'hoge';
    public $primaryKey  = 'id';

    // behaviorの指定
    public $actsAs = [
        'Hoge',
    ];
}

Controller/HogeController.php
// 読み込みたいファイル名
$dbFileName = 'database_another.php';

// $modelの引数は自動付加なので指定不要
$dbValue = $this->Hoge->readDatabaseValue($dbFileName);

結果

任意に指定した「database.php」の情報を読み込むことが出来た
これとDB接続切替を併用することで指定した別のDBへの接続も可能

今回はファイル名のみを渡してreadDatabaseValue()内でフルパスを作成していたが
Controllerで作成したフルパスを渡してやればディレクトリが異なっていても対応可能

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした