CakePHPでアプリケーション独自の設定ファイルを利用する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

CakePHPでは、アプリケーションで使う各種情報をセットするcore.phpやbootstrap.phpなどの設定ファイルがあるものの、コアとなる情報とは設定を分離したいという要件も出てきます。

今回は、そんな要件をかなえるために、オリジナルの設定ファイルの作り方と利用方法を解説します。



オリジナルの設定ファイルを作る


CakePHPの設定ファイルは、Symfonyの設定ファイルのようにYAML形式など特殊な構造となっているわけでなく、core.phpなどを見てわかるように単なるPHPファイルとなっています。

(独自のリーダーを定義できるのでXMLやYAMLのリーダーを作ればその設定ファイルを読めるみたいですが)

なので、設定情報はPHPの構文どおりで自由に書けるわけです。


オリジナルの設定ファイルも取りあえずPHPの構文でエラーが無い状態であれば好きに記述して読込むことができます。

例えば、以下のようなオリジナルの設定ファイル(myApp.php)を用意します。

設定ファイルは、Configディレクトリ(/path/to/CakePHP/app/Config/以下)に配置しておきます。


<?php

$config["Dir"] = "/path/to/your/app/";

$config["message"] = array(0 => "hoge",
                           1 => "foo");


設定内容は、$config変数に配列として詰め込んでいきます

これ以外の変数で指定しても無視されます。

上記の設定ファイルを読込むには、コントローラーファイルで以下のように呼び出します。


<?php

App::uses('AppController', 'Controller');

class PagesController extends AppController {

    public $name = 'Pages';

    public function display() {
        Configure::load("myApp.php");
        $dir = Configure::read("Dir");
        $msg1 = Configure::read("message.0");
        $msg2 = Configure::read("message.1");
    }
}


Configure::loadにより、設定ファイルが読込まれConfigure::readにより呼び出したいキーを指定します。

呼び出したい設定値が配列の場合はキーを指定すれば全体が、多次元配列の場合は上記のようにドットでドットで区切ることで指定のキーの値を取り出すことができます


ちなみに、Configure::loadはcore.phpやbootstrap.php内でも記述できます

必ず読込む設定ファイルとなっているようなものであれば、コントローラファイルではなくbootstrap.phpなどから呼び出しておけば、必要なたびにコントローラ内で操作する必要がありません。



設定ファイルの操作方法


既に半分ほどは書いているのですが、設定ファイルのその他の操作方法についてまとめておきます。


設定ファイルの読み込みについては、先ほど書いたようにConfigure::readにより行えますが、呼び出すキーを指定しなかった場合は、現在の設定ファイルの全体が読込まれます

これにより、core.phpやbootstrap.phpなどCakePHPコアに関する設定も含めて現在の設定情報が確認できますので、CakePHPの挙動が意図どおりになっていないというような場合に確認するのに便利です。

(厳密に言えばデフォルトの引数が「debug」となっており、これを指定すると全設定を返します)


設定ファイルは書き込みを行うこともできます。

単体ではあまり利用シーンが思い浮かびませんが、この後紹介する設定ファイルの書き出しと合わせれば、オリジナルの設定ファイルをDBの状況などにあわせて書き換えるといったことができたりします。


<?php

App::uses('AppController', 'Controller');

class PagesController extends AppController {

    public $name = 'Pages';

    public function display() {
        Configure::load("myApp.php");
        // messageキーに情報を追加
        Configure::write("message.2", "fugafuga");
        // 追加した情報を呼び出し
        $msg3 = Configure::read("message.2");
    }
}


設定ファイルに書き出した情報は、グローバル変数のように各メソッドで呼び出すことはできますが、セッション情報のように記録されているわけでなく、ページ遷移をしてしまうと失われます

また、書き出した設定を意図的に削除したい場合はConfigure::delete()で行えます。


設定ファイルを保存したい場合は、下記のConfigure::dumpを使います。


<?php

App::uses('AppController', 'Controller');

class PagesController extends AppController {

    public $name = 'Pages';

    public function display() {
        Configure::load("myApp.php");
        Configure::write("my_flg", "hogehoge");
        Configure::dump("myApp.php", 'default', array('my_flg'));
    }
}


上記の場合、myApp.phpファイルに設定内容を保存します。

ただし、設定する(dump)際に「my_flg」というキーを指定しています。

これは、その上で書き込んだキーとなっており、指定のキーを値を保存するように指定しています。


<?php
$config = array (
  'my_flg' => 'hogehoge',
);

特に特定の情報だけでなく、すべての設定値を保存したい場合は、特にこの第3引数のキーの指定は要りません。

その場合、core.phpやbootstrap.phpの内容も含めてすべての有効な設定が保存されることになりますが。


そして、この設定ファイルを保存する際の注意点としては、app/ConfigディレクトリへApacheユーザーが書き込むため、パーミッションを設定しておかなくてはなりません。


Warning (2): file_put_contents(/path/to/cakephp/app/Config/myApp.php): failed to open stream: Permission denied [CORE/Cake/Configure/PhpReader.php, line 100]


設定ファイルだけでも多様な操作ができるわけですが、サブシステムごとに設定を切り分けたいという場合や、アクションごとに読込む設定を変えたいという場合は、こういったオリジナルの設定ファイルを使う手段が有効になるかもしれません。