📝

Symfonyの設定ファイルでのwhenを使った再利用について

2023/12/18に公開

Symfony Advent Calendar 2023 の18日目の記事です!

Symfonyの設定ファイルでは when キーワードを使って環境ごとの設定を記述できます。

# config/framework.yaml
# see https://symfony.com/doc/current/reference/configuration/framework.html
framework:
    secret: '%env(APP_SECRET)%'
    #csrf_protection: true
    handle_all_throwables: true

    # Enables session support. Note that the session will ONLY be started if you read or write from it.
    # Remove or comment this section to explicitly disable session support.
    session:
        handler_id: null
        cookie_secure: auto
        cookie_samesite: lax

    #esi: true
    #fragments: true
    php_errors:
        log: true

when@prod:
    framework:
        trusted_proxies: '127.0.0.1,REMOTE_ADDR'

when@test:
    framework:
        test: true
        session:
            storage_factory_id: session.storage.factory.mock_file

    liip_test_fixtures:
        cache_db:
            sqlite: Liip\TestFixturesBundle\Services\DatabaseBackup\SqliteDatabaseBackup

このような形で when@prod, when@test と一つのファイルで環境ごとの設定を変えることができます。
APP_ENVで定義されいる値によって切り替わります。
APP_ENV=prodだったら、whenがついてない最初に定義されているframework: から始まる設定部分をベースに when@prod で定義してある trusted_proxies: '127.0.0.1,REMOTE_ADDR'の部分が追加されます。

ちなみに昔は以前は config/packages/<environment-name>/*.<extension> みたいにファイルごと分けて書いていました。
今は when キーワードを選択するか環境ごとにファイルを分割するかどちらも利用可能です。

設定ファイルの再利用

whenキーワードを使って環境ごとに設定していると、環境A,環境Bだけは共通で環境Cはちょっと変えたいんだよなぁってことが起こります。
たとえば、ステージングと本番環境は同じ設定をしたいよなぁというのとか。

when@prod:
    framework:
        trusted_proxies: '127.0.0.1,REMOTE_ADDR'
when@stg:
    framework:
        trusted_proxies: '127.0.0.1,REMOTE_ADDR'

その場合に上記のようにコピペして書いてしまいがちですよね。(僕はコピペしてました...)
でも実はこの設定を再利用することができます。

以下のように書くことで再利用することができます。

when@prod:
    framework: &framework_prod
        trusted_proxies: '127.0.0.1,REMOTE_ADDR'
when@stg:
    framework: *framework_prod

アンカーとエイリアスについて

&framework_prod の部分、&から始まる名前をアンカー言います。
そして*framework_prod の部分、 *から始まる名前をエイリアスと言います。
つまり、アンカーで定義された設定情報をエイリアスとして利用すると再利用できるということです。

参考

Configuration Environments

Discussion