質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

3回答

5355閲覧

Laravel9 読み込む.envファイルを環境ごとに切り替えたい。

tkm0604

総合スコア552

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2022/10/14 02:42

編集2022/10/14 06:28

環境変数で開発環境か本番環境か判定して条件分岐するようにしたいです。

開発環境ではメール送信にmailhogを使っており、本番環境ではsendgridを使用予定です。
(sendgrid、取得したAPIキーからenvを編集。動作確認済み。)

どうすれば、環境変数で開発環境(mailhog)か本番環境(sendgrid)か判定して条件分岐させる事ができるでしょうか?

試した事。
lalaravel bootstrap/app.php
を以下に修正。

app.php

1/* 2|-------------------------------------------------------------------------- 3| 環境によって読み込む.envファイル切り替え 4|-------------------------------------------------------------------------- 5*/ 6 7switch ($_SERVER['localhost'] ?? 'localhost') { 8 case 'production.co.jp': 9 $app->loadEnvironmentFrom('.env.production'); 10 break; 11}

しかし、「環境変数で開発環境か本番環境か判定して条件分岐する」とはニュアンスが違うような、、、
そもそもswitch ($_SERVER['sample']、case 'localhost':としてみて、

app.php

1switch ($_SERVER['sample'] ?? 'localhost') { 2 case 'localhost': 3 $app->loadEnvironmentFrom('.env.production'); 4 break; 5}

localhostにアクセスしたら case 'localhost':以降が実行すると、以下のエラーメッセージがブラウザから表示されました。

Expected response code "250/251/252" but got code "550", with message "550 5.7.1 Relaying denied".

bootstrap/app.php を編集もうまくできていませんが、この方法では「環境変数で開発環境か本番環境か判定して条件分岐する」と意図する事が違うような気がします。

環境変数で開発環境(mailhog)か本番環境(sendgrid)か判定して条件分岐させる事ができるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/10/14 02:43

実際にSERVER_NAMEには何が入ってるんでしょう。
tkm0604

2022/10/14 02:59

コメントありがとうございます。 TOPのviewを返す関数に dd(request()->server->get('SERVER_NAME')); を追加した結果 「""」 が返ってきました。 */ public function index() { $users = User::orderBy('created_at', 'desc')->take(3)->get();   //SERVER_NAME'確認のために以下を追加 dd(request()->server->get('SERVER_NAME')); return view('/top', compact('users')); } SERVER_NAMEの確認方法は上記であっていますか?
m.ts10806

2022/10/14 03:02

コードで $_SERVER['SERVER_NAME'] を使われてるのでその中身の確認をしてもらいたかったのですが・・。
tkm0604

2022/10/14 03:54

すみません。よく理解できていません。。。。 「コードで $_SERVER['SERVER_NAME'] を使われてる」 ここですが、$_SERVER['SERVER_NAME'はどこで使われているいますか?
m.ts10806

2022/10/14 04:03

ご自身が提示された >2.bootstrap/app.phpを以下に編集。 の下のコードにあります。
tkm0604

2022/10/14 04:36

ありがとうございます。 開発環境用メールテストにmailhogを使っており、本番環境用にTwilio SendGridを使用 します。 SendGridのAPIキーを使って、SendGridの動作は確認できています。 開発環境(メール送信にmailhog)では.envを使い、本番では.env.prodを読み込むように、読み込む.envファイルを環境ごとに切り替えしたいです。
tkm0604

2022/10/14 04:38

しかし、現状本番環境(UR未取得)ないので、開発環境のlocalhostにアクセスしたときに.env.prod を読み込ませ、SendGridの動作確認。を取りたい。 mailhogかsendgrid使うかは環境変数で開発環境か本番環境か判定して条件分岐するようにしたいです。
tkm0604

2022/10/14 05:01

//localhostにアクセスした時は.envを読みにいく switch ($_SERVER['http://localhost'] ?? 'local') { //production.co.jp(本番環境)にアクセスした時は、'.env.prodを読みにく。 case 'production.co.jp': $app->loadEnvironmentFrom('.env.prod'); break; } この認識で間違い無いでしょうか?
m.ts10806

2022/10/14 05:11

いえ、全然・・・。 「http://localhost」というキーにするのでしたら構わないですが、そのキーは不適切な気もします。
m.ts10806

2022/10/14 05:20 編集

ただ、環境毎にファイルを作るより.env自体を環境にあわせてデプロイするのが最も簡単だと思いますが。 (Javaのようにプロパティファイルも込みでコンパイル必要であれば別ですが、PHPはそうではないので)
kawax

2022/10/14 05:23

開発環境の.envをSendGrid使うように一時的に書き換えればいいだけ。mailhogに戻すときはまた書き換えればいい。簡単にできることを難しく考えすぎ。 毎度のXY問題。本当にやりたいことを書かずに質問すると正しい回答が得られない。
tkm0604

2022/10/14 05:32

ありがとうございます。 おっしゃるように、.envを書き換えればいい話なのですが、 「環境変数で開発環境か本番環境か判定して条件分岐するようにしてもらいたい」 という要望を受けて、今回の質問をさせて頂きました。
tkm0604

2022/10/14 05:36

「環境変数で開発環境か本番環境か判定して条件分岐するようにしてもらいたい」 こちらの要望に応えるのに、 bootstrap/app.php にコードを追記する方法が見つかりました。 ひょっとすると、 bootstrap/app.phpから解決するのも、要望から外れているのかもしれません。。。。 環境変数で開発環境(mailhog)か本番環境(sendgrid)か判定して条件分岐するようにしたいです。 質問の意図が伝わりにくくてすみません。
m.ts10806

2022/10/14 05:56

だいぶ削られたようですが、より丸投げ感が増してしまっているので回答はしていますが修正依頼をしています。
tkm0604

2022/10/14 06:04

丸投げにしているつもりはなく、どうすれば質問の意図が伝わるかと思い、文章を変えてみたのですが、、、 そのように伝わっていたなら、申し訳ありませんでした。
m.ts10806

2022/10/14 06:10

いえ、現状「やりたいこと」が書いてあって「どうすれば」だけなので、 「調べたこと試したこと」部分がごっそりなくなった今では完全に丸投げと言わざるを得ません。 ※責めているわけではなく、情報を適切に提示してもらいたいだけです
guest

回答3

0

ベストアンサー

フレームワークに用意されてる機能を自分で作ろうとしなくていい。

.envの扱いはセキュリティ的にものすごく重要なので理解できてない初心者が余計なことしてはいけない。

1 一番通常の方法

本番用の.envは本番環境にだけ作る。
.env.prodなんて作ってる時点で普通の使い方から外れてる。

ローカルではローカルにある.envが読み込まれる。
本番では本番環境の.envが読み込まれる。
環境によって.envを切り替えるという目的は達成できる。
これがLaravelでの普通。これを理解していることが最低限の前提。

2 本番用.envも入れる場合

リポジトリが完全に非公開でどうしても本番用の.envも入れたい場合。
.env.productionを作ればこれが本番用。
.envがなく.env.productionがあれば.env.productionの方が使われる。
このproductionがどこから来たかというとLaravelで決められてるキーワード。
本番はproductionと決まっているので勝手にprodとか作らない。
https://github.com/laravel/framework/blob/79aed20f54b6ab75f926bf7d0dd7a5043ceb774a/src/Illuminate/Foundation/Application.php#L599
production,local,testingは決められたキーワード。
このうち今がどの環境かは.envもしくは環境変数のAPP_ENVで決まる。
artisanコマンドなら--envで上書きできる。

.envも環境変数もない場合はproduction。
なぜproductionがデフォルトかというとlocalだった場合本番環境では公開すべきではないエラーメッセージが表示されて危険だから。
一番安全側に倒している。
https://github.com/laravel/laravel/blob/5daa02c70b27212aea4b2e302c4ac5ba65b1e789/config/app.php#L31

3 本番用.envを暗号化する

最近追加された新機能。
例え非公開だろうと本番用.envを入れるべきではないけど暗号化すれば安全に入れられる。
https://laravel.com/docs/9.x/configuration#encrypting-environment-files

php artisan env:encrypt --env=production
php artisan env:decrypt --env=production

投稿2022/10/14 05:16

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

色々自分なりに考えた結果、開発用の.en 本番用の.env分ける。 本番用の.envの共有方法はアクセス制限をかけたクラウドで共有。 が良いのかなと思いました。

if文で.envを切り分けるのは安全性の観点からもよろしくない。という結論に至りました。
色々調べて考えるきっかけになりました。

コメントいただきありがとうございました。

投稿2022/10/20 03:42

tkm0604

総合スコア552

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのサーバーの環境変数を設定して(Windowsなら下記)
イメージ説明
※可能なら実行ユーザのほうに入れたいが参考のためシステムの方に入れてます

PHPから参照

PHP

1<?php 2echo getenv("LaravelEnv"); 3//もしくは 4echo $_SERVER["LaravelEnv"];

同じキーでそのサーバーに設定すればその値をとってくるのでコードの変更の必要はないです。

投稿2022/10/14 05:53

編集2022/10/14 05:56
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/10/14 05:55

「環境変数」という絶対的なキーワードが最初から出ているので 「利用したいOS名(Windows/Linux(Ubuntu,CentOSなど) 環境変数」で設定方法調べて 「PHP 環境変数取得」で調べれば出てきます。 ※もちろんLaravelとして望ましいかは別の話。
m.ts10806

2022/10/14 06:56

localhost とか sample とかいうキーで環境変数を設定してOS再起動すれば参照できるので、 正しく設定してないか再起動してないだけでしょうね。 ※もちろんプロジェクトやフレームワーク固有のキーを付けた方が良い。予約語みたいなのと衝突したらまずいし
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問