0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Symfony-Standard3.4の環境変数(env)の設定元について

Posted at

はじめに

以下の記事はSymfonyではなくSymfony-Standardなので注意。
というかこれ調べるまでSymfonyって1つしかないと思ってて、SymfonyとSymfony-Standardで分かれていると思ってなかった。

何がどう違うのかの説明は割愛。
というか知らん。

きっかけ

企業案件なので詳細は記載できないが、きっかけは $this->getEnvironment()を基に条件判定している箇所があり、本番環境への影響調査をしている過程において。

$this->getEnvironment()

アプリ内部

ドキュメントルートにて、本番環境ではapp.phpを、本番環境以外ではapp_dev.phpを指定するように示唆するようなことが公式に記載されている。

環境とは
環境は、アプリケーションの実行に使用される構成のグループを表します。symfony はデフォルトで 2 つの環境を定義します: dev(アプ> リケーションをローカルで開発する場合に適しています) とprod(本番環境でアプリケーションを実行する場合に最適化されています)。

http://localhost:8000ブラウザーで URLにアクセスすると、dev環境で Symfony アプリケーションが実行されます。環境内のア> プリケーションにアクセスするにはprod、http://localhost:8000/app.php 代わりに URL にアクセスしてください。devURL に> 常に環境を表示したい場合は、 http://localhost:8000/app_dev.phpURL にアクセスしてください。

app.phpapp_dev.phpがURLに入っていたのでは見てくれが悪いので、、、とまで言えばわかるだろうか。
apacheやnginxなどでドキュメントルートの設定やシンボリックシンクなどでアクセスを飛ばす設定をしたことがある方はここまで記載すればピンときていることだろう。

前置き(前提情報)はここまでとし、AppKernelクラスで継承しているKernelクラスを見るとコンストラクトで第一引数として環境変数を受け取り内部プロパティーにセットし、ゲッターも用意されている。

このゲッターこそが、きっかけで記載している$this->getEnvironment()だ。

少し話を遡り、app.phpapp_dev.phpではAppKernelをインスタンス化する際に直書きで環境名を指定し、第一引数に渡している。

つまり、$this->getEnvironment()で取得できる値の設定基は、app.phpapp_dev.phpということが判明した。

個人的には、サーバー内で変数定義等によって設定されているものと思っていたので
config配下や.envやphp.iniやconf.dあたりをずっと探していたが、まさかハードコーティングされている作りになっているとは思っていなかったのでここに辿り着くまでにかなりの時間を要した。

コンソールコマンド

bin/consoleコマンドにてenvオプション指定時の値が取得される

php bin/console --env=test {your-command}
dump($this->getEnvironment()); // test が表示される

bin/consoleコマンドにてenvオプション未指定時にはデフォルト値であるdevが取得される

php bin/console {your-command}
dump($this->getEnvironment()); // dev が表示される

一応、内部的な処理を補足しておくと、直前のリンクを見ていて勘の良い方は気づいただろうが、
コマンド実行時はapp.phpapp_dev.phpは経由していなくて、
代わりにbin/consoleを経由して初期化を行なっている。

以下の部分だが、コマンド実行時のenvオプション指定時の値がAppKernelの第一引数に渡されている仕組みになっている。

$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run($input);

筆者はLaravel派なのでSymfonyは詳しくはないが、多分ここがLaravelと異なるところだと思う。
とか書いておきながらLaravelはどうなっていたか記憶が曖昧だ。
思い出したらSymfonyとLaravelのこのあたりの構造の違いを記載しようと思う。
似たような感じになってたらごめん。

$this->getParameter(‘server_env’)

アプリ内部

.envに記載の内容が取得される

コンソールコマンド

.envに記載の内容が取得される

まとめ

  • $this->getEnvironment()は、app.phpapp_dev.phpで直書きされている値が基となっている。
  • $this->getParameter(‘server_env’)は、.envで値が設定されている。

app.phpは本番用なので最高のパフォーマンスが得られるように最適化されているようだけど、
個人的には、app.phpapp_dev.phpの処理内容はAppKernel.phpの方で$this->getParameter(‘server_env’)で判定して処理切り分けたら環境変数の一元化ができてややこしくないのに、、、と思うけど恐らく、フレームワークのライフサイクルの関係でコンテナサービスが初期化される前の処理部分だろうからこういう作りになってるんだろうなぁと推測します。

宣伝

会社も人間も一緒に成長していける仲間を探しています。

組織拡大のため、2社目設立創業メンバーも募集しています。
2023/3創業予定。

  • 採用活動(Wantedlyへの求人記事執筆等...)
  • 自社プロダクト開発
  • 経理業務
  • 労務業務
  • クライアント先からの仕事依頼
  • 2社目のコーポレートサイト制作

最近子どもを授かりました。
やることいっぱいあって一人じゃ手が回っていません。助けてください。
筆者がたまにおかしいときがあります。
1社目は創業5年目に突入していますが名もなき小さな会社なので採用が難しいです。
優秀な人材はまず獲得できないと思っていて、一緒に試行錯誤していってくれる仲間が欲しいです。
会社作りへの情熱や意識は太陽に照り付けられている海のようにギラギラしています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?