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