symfonyを使ったWebアプリケーション開発での出来事。
アプリケーション用に作成したカスタム設定ファイル(YAML)を、sfYaml::loadで読み出す仕組みにしていました。
# <application>/config/navigation.yml
Nav:
top:
label: "トップ"
linkto: "site/index"
activity:
label: "活動ログ"
linkto: "activity/list"
course:
label: "コース▼"
linkto: "course/map"
...省略...
しかし、ユーザからWEBページにアクセスするたびに、YAMLファイルを解析して配列に変換していては効率が悪い。
さらに、一度設定すれば、たびたび変更するファイルでもない。
例えば、symfony標準の設定ファイル、settings.yml、app.ymlなどは、YAMLファイルの内容をPHPコード化して読み出しを高速化している。
同様にして、navigation.ymlもPHPコード化して、キャッシュする仕組みに変更する。
1.navigation.ymlの読み出しハンドラーを設定する。ハンドラーの種類はいくつかあり、設定内容をsfConfigに結合するハンドラ(sfDefineEnvironmentConfigHandler)などがあるが、sfYaml::loadと同じ挙動にするため、sfSimpleYamlConfigHandlerを利用する。
次のように、<application>/config/config_handlers.ymlを作成する。
# <application>/config/config_handlers.yml
config/navigation.yml:
class: sfSimpleYamlConfigHandler
2.sfYaml::loadの箇所を変更する。
■変更前
$yml = sfYaml::load(sfConfig::get('sf_app_config_dir').DIRECTORY_SEPARATOR.'navigation.yml');
■変更後
$yml = include(sfContext::getInstance()->getConfigCache()->checkConfig('config/navigation.ym
'));
ちなみに、キャッシュファイルの内容を確認すると、YAMLの内容がPHPの配列化されており、その結果がreturnされていることが分かる。
#cache/<application>/<environment>/config/config_navigation.yml.php
<?php
// auto-generated by sfSimpleYamlConfigHandler
// date: 2011/05/07 09:19:26
return array (
'Nav' =>
array (
'top' =>
array (
'label' => 'トップ',
'linkto' => 'site/index'
),
...省略...
これで変更おわりです。設定ファイルの内容を変更した際は、symfony ccでキャッシュを削除してください。
0 件のコメント:
コメントを投稿