unoh.github.com

絵文字のためにsymfonyのカスタムハンドラーを作ってみました

Wed Oct 06 01:10:00 -0700 2010

こんにちは、kayです。

携帯サイトのdocomo絵文字が文字と同じ色になっていると気になって気になって仕方がない今日この頃なのですが、YAMLでデフォルトの色を設定して絵文字を出力するときに自動的にその色にしてくれるなんてことをしたいなぁと思っていました。

しかし、sfYaml::load()をすると毎回パースしてしまうのでとっても頻繁に呼び出される絵文字の色にそれを使ってしまうと大変なことになってしまいます。

app.ymlなどのsymfony側の設定YAMLはパース結果をキャッシュしてくれるのですが、それを絵文字の色の設定でもすればいいと大先生に言われましたのでカスタムハンドラーを作って対応することにしました。

symfonyのビルドインハンドラー

まず、symfonyにはビルトインハンドラーが多数存在しますが、今回は汎用的に使えるsfDefineEnvironmentConfigHandlerとsfSimpleYamlConfigHandlerを見てみました。

結果、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()で設定を読む

YAMLの設定値をとにかく読み込ませておきたい場合はApplicationConfiguration::initialize()等に入れておきます

<?php

abstract class myApplicationConfiguration extends sfApplicationConfiguration
{
    public function initialize()
    {
        $this->getConfigCache()->import('config/hoge.yml', true, true);
    }
}

sfConfig::get()で設定値を取得

とそれぞれ設定した値を返してくれるようになりました!

感想

マスターデータ系はDBではなくYAML等のファイルで設定するのが好きなのですが、その際の問題点を解決出来たので良かったです。みなさまもぜひぜひ使いやすいカスタムハンドラーを作ってみてはいかがでしょうか?