Symfony 3.4 の新機能: 設定ファイルのパラメーター変換

Symfony Advent Calendar 2017 の 18日目の投稿です。

最近は JavaScript ばかり使っており、Symfony 3.4 以降のキャッチアップができてなく、かなり取り残されている感な日々です :sweat_smile: Advent Calendar でいろいろな情報がキャッチアップできいて、感謝です!

この投稿では Symfony Blog で紹介されていた Symfony 3.4 から追加されたパラメーター変換の新機能について Tips を紹介します。

※ 私自身、まだ利用していないので間違いがあればスミマセン

パラメーターの型変換

PHP 7.1 からスカラー型宣言の機能が追加されました。

public function connect(string hostname, int port)
{
    // ...
}

Symfony で設定ファイルからセットした値は全て string 型となってしまい、型宣言を利用するためには自前で型を変換するなどの工夫が必要でした。

parameters:
    app.connection.port: '%env(DATABASE_PORT)%' #=> string

Symfony 3.4 から環境変数を取り扱う処理に改善がなされ、設定ファイルで任意のスカラー型への変換ができるようになりました。

parameters:
    app.connection.port: '%env(int:DATABASE_PORT)%'

この記述は以下と等価です。

(int) getenv('DATABASE_PORT')

現在は array:bool:int:float:string: が利用できるようですね :smile_cat: 細部の機能ですが、これによってこれまで以上にスカラー型宣言を手軽に利用できるようになりましたね :smile_cat:

その他の演算子

スカラー型の変換以外にも、以下の演算子が提供されています。

resolve:

変数をセットした文字列型の値に変換します。

parameters:
    project_dir: '/foo/bar'
    env(DB): 'sqlite://%%project_dir%%/var/data.db'
    db_dsn: '%env(resolve:DB)%'

file:

指定したファイルパスを読み取り文字列に変換します。

parameters:
    env(SECRETS_FILE): '/etc/secure/example.com/secrets.json'
    app.secrets: '%env(file:SECRETS_FILE)%'

json:

JSON を PHP の配列に変換します。さらに json:file: の併用することで JSON ファルのファイルパスを読み取り PHP の配列に変換することも可能です。

parameters:
    env(SECRETS_FILE): '/etc/secure/example.com/secrets.json'
    app.secrets: '%env(json:file:SECRETS_FILE)%'

base64:

base64 でエンコードします。

parameters:
    env(SOME_VALUE): 'NWE3OWExYzg2NmVmZWY5Y2ExODAwZjk3MWQ2ODlmM2U='
    app.some_value: '%env(base64:SOME_VALUE)%'

constant:

PHP の定数にします。

parameters:
    env(NUM_ITEMS): 'App\\Entity\\BlogPost::NUM_ITEMS'
    app.num_items: '%env(constant:NUM_ITEMS)%'

カスタマイズ

さらに処理を自作することもできるようです・・・!EnvVarProcessorInterface を実装し container.env_var_processor のタグを利用するようです。

実際に試してみて、実装例を紹介しようと思ったのですが、時間の都合でできませんでした :sweat: 試してみてうまくできたら紹介しようと思います。

最後に

今回の新機能で設定ファイルで様々な処理が実現できるようになった一方で、自由度が高まった分、設定ファイルのコンパイルでどこまでの変換処理を行うかは設計・実装のポイントの一つになりそうですね。うまく活用してよりよいアプリケーションを開発したいものです。

自分はまだ機能を使っていないので、まずは使ってみて感触を掴んでみたいと思ってます。既に使ってる人がいたら感想をぜひ教えてください :smile_cat:

それでは :smile_cat:

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.