忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/05/08 10:31 |
Symfony-6.1日目 app.ymlの書き方と呼び方

6日目までのチュートリアルにはapp.ymlの書き方が見つからなかったので簡単に解説。
config_handler.ymlまでやり始めるとよくわからないのでとりあえずはパス。


まずapp.ymlが何かっていうと、自作プログラムでありがちなconfig.phpとかconst.phpみたいなものです。
動的に変更されることはあまりないけど、サイト全体で共有しておきたい設定なんかを格納しておきます。
YAML形式で書くことで、PHPで書くより素人にもわかりやすく、XMLみたいにタグがいっぱいでめんどくさいといったこともない簡単な設定ファイルにすることができます。


app.ymlを置ける場所は複数あります。
config/app.yml
apps/frontend/config/app.yml

前者がプロジェクト全体から呼び出せるもので、後者はアプリケーション単位の定義となります。
使用する際には両者がマージされ、両者で同じ名前がある場合は範囲の狭いアプリケーション単位のほうが優先されます。
後者が置けるのだから当然apps/frontend/modules/***/config/app.ymlでモジュール単位の設定もできるだろうと思ったら何故かできませんでした。


次にYAMLの書き方。
6日目のチュートリアルでは下記のようになっています。
 

1
2
all:
  active_days: 30


トップレベルにはall、prod、test、devの4種類を置くことができます。
allは全環境、prodは本番環境、devは開発環境でのみ設定される内容になります。
testはあんまり使わないのでまあいいや。

要素は半角スペース2つでインデントしたあとに記入します。
:のあとに半角スペースを最低1個置いたあと値を記入すると、それが要素の値となります。
上記の場合はactive_daysの値が30ということになります。

複数のトップレベルに同じ要素を記入した場合、範囲が狭い方が優先されます。
従って最終的な書き方は以下のようになります。
 

1
2
3
4
5
6
7
all:
  hoge: hoge_all
prod:
  name: 本番環境
dev:
  name: 開発環境
  hoge: hoge_dev


sfConfig::get()で実際に値を取得することができます。
app.ymlから内容を取得する場合は、引数のプレフィックスに必ず'app_'が付きます。

開発環境で実行した場合、
sfConfig::get('app_hoge')  → hoge_dev
sfConfig::get('app_name')  → 開発環境
本番環境で実行した場合、
sfConfig::get('app_hoge')  → hoge_all
sfConfig::get('app_name')  → 本番環境
というふうになります。

基本的には、allに全ての設定を記入し、prodで本番時のみ参照したいデータを記述するということになるでしょう。


さて、YAMLを階層構造にすることができます。
半角スペースを2つ増やすたびに一段階深くなります。
カテゴリ毎に情報を纏めたたりする場合に便利なのですが……ここにひとつ落とし穴があります。
 

1
2
3
4
5
6
7
8
all:
  data:       data_zero
  one:
    data:     data_one
    two:
      data:   data_two
      three:
        data: data_three


このようなYAMLがあるとして、階層構造のデータを取得するときは'_'で区切ることで次の階層に進むことができます。
'data_zero'を取得したいならsfConfig::get('app_data')です。
'data_one'を取得したい場合はsfConfig::get('app_one_data')となります。
ここまではいいのですが、では次の'data_two'を取得したければsfConfig::get('app_one_two_data')でいいかと思えば駄目です。
3段階目以降は何故か直接sfConfig::get()することができません。
sfConfig::get('app_one_two')とすることで、それ以下の階層が連想配列で入ってきます。
'data_three'は、$data_two=sfConfig::get('app_one_two');$data_three=$data_two['three']['data'];とする必要があります。

当初これに気がつかずに「値が取得できねー」とさんざっぱら悩みました。
リファレンスに微塵も書かれてないというのはどういうことなのだろうな。


Symfonyの記事一覧

PR


2010/01/01 17:27 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2010/01/03 | HOME | Symfony-6日目その1>>
忍者ブログ[PR]