/* あとでなおす */

友達募集中

【CakePHP】プラグインの下にある設定ファイルをプラグイン以外から読み込む

CakePHP で設定ファイルは通常「app/Config/coinfig.php」に置き*1、その設定ファイル内に複数個の設定を記載することができます。

$config = array(
  'name' = '山田 太郎',
  'hobby' = array('Game', 'Music'),
  'family' = array(
    'father' = '山田 勤',
    'mother' = '山田 巴',
  ),
)

呼び出す場合には以下のように記載します。
上記ではfamilyの部分が配列の中に配列を記載していますが、その場合はドットで階層区切りで書くことで呼び出せます。
もちろん3階層以上も呼び出すことも可能*2ですし、取得した結果を変数に保持することも可能です。
ここらへんの階層については詳細な説明をしているブログ等も多数あるので、そちらを参照した方がよろしいかと思います。

Configure::load('config');

class testClass {
  public function main() {
    // 名前を取得
    $name = Configure::read('name');
    // 趣味を配列で取得
    $hobby = Configure::read('hobby');
    // 家族を連想配列で取得
    $family = Configure::read('name.family');
    // 家族の中から母親を取得
    $mother = Configure::read('name.mother');
  }
}

ここで問題になってくるのはプラグイン(Plugin)を使用している場合のConfigの呼び出し方です。
使用している方はご存知かと思いますが、プラグインの下にある設定ファイルは「app/Config/coinfig.php」ではなく「app/Plugin/対象のプラグイン名/Config/config.php」にあります。プラグイン内にあるモデルやコントローラなどから同一プラグインにある設定ファイルを呼び出す場合には上記と同じ書き方で良いですが、プラグイン外から呼び出す場合には下記のようにあらかじめプラグインフォルダを指定してロードする必要があります。

下記のコードは上記に記載した設定ファイルと同じ内容の設定ファイルが「app/Plugin/TestApp001/Config/config.php」「app/Plugin/TestApp002/Config/config.php」の異なるプラグインにある前提とします。
TestApp001の設定ファイルを読み込んだ後にTestApp002の設定ファイルを読み込んでいます。

class testClass {
  public function main() {
    // app/Plugin/TestApp001/Config/config.php をロード
    Conigure::load('TestApp001.config');
    
    // app/Plugin/TestApp001/Config/config.php から名前を取得
    $name = Configure::read('name');
    // app/Plugin/TestApp001/Config/config.php から趣味を配列で取得
    $hobby = Configure::read('hobby');
    // app/Plugin/TestApp001/Config/config.php から家族を連想配列で取得
    $family = Configure::read('name.family');
    // app/Plugin/TestApp001/Config/config.php から家族の中から母親を取得
    $mother = Configure::read('name.mother');
    
    
    // ここでPlugin/TestApp001/Config/config.php から読み込んだ設定情報を破棄
    // Configure::checkで存在確認し、存在する場合のみConfigure::deleteで削除
    if (Configure::check('name')) {
        Configure::delete('name');
    }
    if (Configure::check('hobby')) {
        Configure::delete('hobby');
    }
    if (Configure::check('name.family')) {
    	Configure::delete('name.family');
    }
    if (Configure::check('name.mother')) {
    	Configure::delete('name.mother');
    }
    
    
    // app/Plugin/TestApp002/Config/config.php をロード
    Conigure::load('TestApp002.config');
	
    // app/Plugin/TestApp002/Config/config.php から名前を取得
    $name = Configure::read('name');
    // app/Plugin/TestApp002/Config/config.php から趣味を配列で取得
    $hobby = Configure::read('hobby');
    // app/Plugin/TestApp002/Config/config.php から連想家族を配列で取得
    $family = Configure::read('name.family');
    // app/Plugin/TestApp002/Config/config.php から家族の中から母親を取得
    $mother = Configure::read('name.mother');
  }
}

 

上記からわかるように1つ目のポイントは「Conigure::load('対象プラグイン名.config');」でロードしてから読み込むことです。
2つ目のポイントはTestApp002をロードする前にTestApp001で読み込んだ設定を破棄していることです。
破棄しないと例えばTestApp002の「$name = Configure::read('name');」の時にロード済みの全ての設定ファイルのうちキーが「name」になっている設定を読み込んでしまうためTestApp001とTestApp002の両方の設定を取得してしまいます。 2回読み込んでもTestApp002のnameで基本的には上書きされるのでそれほど問題ありませんが、例外的に配列のみはなぜか上書きではなく要素追加になるので、上記の例だとhobbyを破棄せず2回読み込むと $hobby = array('Game', 'Music', 'Game', 'Music') のようになってしまいます。
これは文字列などの単一項目や連想配列のようにキーがある場合には発生しません。
またプラグイン違いでも設定ファイルのキーが重複しなければ破棄する必要はありません。

このプラグインの設定ファイルの呼び出しはバージョンがあまりにも古いとサポートされていませんが、PHPは5.0以上でCakePHPは2.0以上ならばサポート済み*3です。

*1:ファイル名は「coinfig.php」以外でも可能ですが、読み込み時の書き方が変わったり保守的にもどこに設定が書いてあるのかがわかりにくかったりするのでファイル名を変更することはお勧めしません。

*2:階層の数に上限はあるかもしれませんがそこらへんは不明です。4階層くらいまでなら書いたことがあるので少なくとも人間が読めるレベルくらいの階層まで行けるはずです。

*3:うろ覚えなので外れていたらごめんなさい。