【CakePHP3】 設定ファイルにINIやJSONを使う
fukasawaです。こんにちは。急に暖かくなりましたね。湿気が気になります。
CakePHPにはConfigureというクラスがあり、これを使用することでアプリケーション全体で使う変数を一箇所に定義しておくことができます。 CakePHP3にはconfig/app.phpという設定ファイルがデフォルトで存在しており、この中でデータベースの接続設定やログの出力設定等について定義されているのですが、このapp.phpもConfigureクラスを使用して読み込まれています。
例えば、app.php以外の任意の設定ファイルを追加したい場合、PHPファイルを新たに作成し、app.phpと同様にConfigureクラスを使用して読み込むことになるのですが、読み込む設定ファイルの形式としてINIファイルやJSONファイルを使用することができるようです。今回はその設定方法について見てみたいと思います。
※CakePHP2にも同様の機能があります。(使い方が少し異なるようです)
任意の設定ファイル(.php)を追加する場合
まず、app.phpの他にtest_config.phpという設定ファイルを追加したい場合について確認します。
config/test_config.phpというファイルを作成します。(テスト用に適当なデータを入れておきます。)
<?php return [ 'TestAdmin'=>[ 'name' => '馬車道 太郎', 'division' => 'コンテンツ企画部' ], ];
config/bootstrap.phpの中でConfigure::load()を使いapp.phpを読み込んでいる箇所があるので、その下のあたりにtest_config.phpを読み込む記述を追加します。
try { Configure::config('default', new PhpConfig()); Configure::load('app', 'default', false); Configure::load('test_config', 'default', false); // ←この行を追加 } catch (\Exception $e) { die($e->getMessage() . "\n"); }
※config内にディレクトリを作成し、config/myconf/testconfig.phpのようにファイルを配置したい場合は、'testconfig'の部分に'myconf/test_config'を指定すればOKです。
適当なコントローラ内でtest_config.phpで定義した変数を読み込んでみます。設定した変数を読み込むにはConfigure::read()を使用します。
use Cake\Core\Configure; // Configureクラスをインポート ... debug(Configure::read('TestAdmin'));
下記のように表示され、追加した設定ファイルが読み込まれていることが確認できました。
任意の設定ファイル(.ini)を追加する
次に、INIファイルを設定ファイルとして使う場合についてです。INIファイルはphp.ini等で使用されている形式です。
テスト用に下記のINIファイルを用意しました。config/test_config2.iniという名前で保存します。
[TestShop] name = 馬車道ハンバーグ established_year = 1980
bootstrap.phpで設定ファイルを読み込みます。INIファイルを扱うために、IniConfigクラスを使用します。
use Cake\Core\Configure\Engine\IniConfig; ... // Configure::load()で設定ファイルを読み込んでいるあたりに下記を追加。 Configure::config('ini', new IniConfig()); Configure::load('test_config2', 'ini', false);
Configure::config()の第一引数で指定した'ini'は任意の名前です。 Configure::config()で'ini'を指定した場合、Configure::load()の第二引数もそれに合わせる必要があります。
設定した変数を適当なコントローラで読み込んでみます。
use Cake\Core\Configure; ... debug(Configure::read('TestShop.name'));
下記のような表示になり、設定ファイルが読み込まれていることが確認できました。
任意の設定ファイル(.json)を追加する
次にJSONファイルです。基本的にINIファイルと同じです。
テスト用に下記のJSONファイルを用意しました。config/test_config3.jsonという名前で保存します。
{ "Owner": { "name": "馬車道 一郎", "ruby": "バシャミチ イチロウ" }, "Contact": { "TEL": "000-0000-0000", "FAX": "999-9999-9999" } }
bootstrap.phpで設定ファイルを読み込みます。JSONファイルを扱うために、JsonConfigを使用します。
<?php use Cake\Core\Configure\Engine\JsonConfig; // ... // Configure::load()で設定ファイルを読み込んでいるあたりに下記を追加。 Configure::config('json', new JsonConfig()); Configure::load('test_config3', 'json', false);
設定した値を適当なコントローラで読み込んでみます。
<?php use Cake\Core\Configure; // ... debug(Configure::read('Contact'));
下記のような表示になりました。
その他の形式の設定ファイルを使用する
INIファイルやJSONファイル以外の形式の設定ファイルを使用したい、という場合はConfigEngineInterfaceを実装した 独自のクラスを作成することで実現できます。公式サイトのドキュメントにXMLファイルを設定ファイルとして使用する 場合のサンプルコードが乗っていますのでそちらを参照してください。
Configureで定義された変数をファイルに書き出す
最後に、Configureで定義された変数をファイルに書き出す方法について見てみます。Configure::dump()を使うことで、Configureクラスを使用して読み込まえた設定ファイルの変数や、Configure::write()で書き込まれた変数をファイルに吐き出す事ができます。
<?php
// config/dump_test.phpというファイルが作成され、読み込んでいる設定ファイルの内容がPHPファイルとして書き出される
Configure::dump('dump_test', 'default');
// config/dump_test2.iniというファイルが作成され、読み込んでいる設定ファイルの内容がiniファイルとして書き出される
Configure::dump('dump_test2', 'ini');
// config/dump_test3.jsonというファイルが作成され、読み込んでいる設定ファイルの内容がjsonファイルとして書き出される
Configure::dump('dump_test3', 'json');
上記で指定している「default」「ini」「json」はそれぞれConfigure::config()の第一引数で指定した名前です。 吐き出されたファイルは、設定ファイルとしてConfigure::load()で読み込める形式になっています。 ちなみに、既に存在しているファイルと同じファイル名を指定すると上書きされてしまうので注意が必要です。
第三引数でキーを指定すると、指定したキーが持つデータのみ書き出すことができます。以下では「TestAdmin」「TestShop」のみがdump_test.phpに書き出されます。
<?php
Configure::dump('dump_test', 'default', ['TestAdmin','TestShop']);