0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-06

環境

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で作成したフルパスを渡してやればディレクトリが異なっていても対応可能

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?