« DOMろうTouchコンテンツ | メイン | Illustratorの小技 その3 ブレンド機能をパスにする »

絵文字のためにsymfonyのカスタムハンドラーを作ってみました
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは、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
とそれぞれ設定した値を返してくれるようになりました!

感想

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

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/1871

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


画像の中に見える文字を入力してください。