こんにちは、kayです。
携帯サイトのdocomo絵文字が文字と同じ色になっていると気になって気になって仕方がない今日この頃なのですが、YAMLでデフォルトの色を設定して絵文字を出力するときに自動的にその色にしてくれるなんてことをしたいなぁと思っていました。
しかし、sfYaml::load()をすると毎回パースしてしまうのでとっても頻繁に呼び出される絵文字の色にそれを使ってしまうと大変なことになってしまいます。
app.ymlなどのsymfony側の設定YAMLはパース結果をキャッシュしてくれるのですが、それを絵文字の色の設定でもすればいいと大先生に言われましたのでカスタムハンドラーを作って対応することにしました。
symfonyのビルドインハンドラー
まず、symfonyにはビルトインハンドラーが多数存在しますが、今回は汎用的に使えるsfDefineEnvironmentConfigHandlerとsfSimpleYamlConfigHandlerを見てみました。
-
sfDefineEnvironmentConfigHandler
app.ymlのようにdev, prodなどの環境に応じて異なる値が設定できる汎用ハンドラー
この場合環境によって設定が異なる訳ではないのでリッチすぎる - sfSimpleYamlConfigHandler
パースした結果をキャッシュしてくれるだけのハンドラー
sfConfig::add()をしてくれないので、読みだしただけではsfConfig::get()が使えない
結果、sfSimpleYamlConfigHandlerプラスアルファでsfConfig::add()をしてくれるだけでそこそこ使えるものになるなぁと思いました。
YAMLを用意
# config/hoge.yml
fuga: 1
foo:
bar: 2
config_handlers.ymlを編集
config_handlers.yml内に、上記のYAMLファイルを読むのに使用するハンドラーを指定します。
ファイルパスを指定しておかないとデバッグモードが無効な状態でエラーになってしまうので要注意です。
config/hoge.yml:
class: myHogeConfigHandler
file: %SF_ROOT_DIR%/lib/config/myHogeConfigHandler.class.php
param:
# sfConfig::get()で値を取得する時のキープレフィクス
prefix: hoge_
ハンドラー作成
あくまでも例ですが、下記のようにシンプルに出来ます。
<?php
class myHogeConfigHandler extends sfYamlConfigHandler
{
public function execute($configFiles)
{
$prefix = strtolower($this->getParameterHolder()->get('prefix', ''));
$config = self::parseYamls($configFiles);
$hogeConfig = array();
foreach ($config as $key => $value) {
// sfConfig::get()で使うキープレフィックスを付ける
$hogeConfig[$prefix . $key] = $value;
}
// include等した際に同時に中身をsfConfig::add()もするようにする
return sprintf("<?php\n"
. "// auto-generated by %s\n"
. "// date: %s\n"
. "sfConfig::add(%s);\n",
__CLASS__,
date('Y/m/d H:i:s'),
var_export($hogeConfig, true));
}
}
sfConfigCache::import()で設定を読む
- sfConfigCache::checkConfig()してキャッシュファイルをインクルードしてくれます
- インクルードの帰り値を返してはくれないけどこの場合sfConfig::get()で値を取得出来るようになっているので大丈夫です
YAMLの設定値をとにかく読み込ませておきたい場合はApplicationConfiguration::initialize()等に入れておきます
<?php
abstract class myApplicationConfiguration extends sfApplicationConfiguration
{
public function initialize()
{
$this->getConfigCache()->import('config/hoge.yml', true, true);
}
}
sfConfig::get()で設定値を取得
- sfConfig::get('hoge_fuga')は1
- sfConfig::get('hoge_foo')はarray('bar' => 2)
- sfConfig::get('hoge_foo_bar')は2