👻

LaravelのENVとConfigの違いを理解する

2023/12/26に公開

はじめに

この記事では「LaravelのENVとConfigの違いを理解する」ことを目指します。
Laravelを使用する場合にENVファイルとConfigファイルは触れる機会は多くあります。
普段触っていて「何が違うのだろう?」と思うことも多いと思います。

この二つは似て非なるものですが、特に意識することなく使っていることも多いでしょう。
しかし、特定の操作によってはENVファイルを読み込めなくなることもあります。
これは、ENVとConfigの違いを理解していないから起こることです。

そこで本記事ではこの二つの違いについて解説していきます。

また、環境構築にはDcokerを使用して手早く構築していきます。
この機会にDockerを体験するのも良いのではないでしょうか。

前提条件

この記事では以下の知識を持つことを前提にしています。

  • HTML&CSS, PHPをある程度は理解している
  • Linuxコマンドに触れたことがある

これらについては詳細に解説することはありませんのでご承知ください。

目的&内容

LaravelのENVとConfigの違いを理解することを目的とします。
そのために下記の内容を実施していきます。

  1. DockerでLaravel9を導入する
  2. テストページを作成する
  3. 設定ファイルを作成する
  4. 本番環境と開発環境を切り替える
  5. 本格的なENV設定をする

このようにLaravelのテストページを表示して 終わり にしないための記事です。
動かして終わりではなく環境設定が出来てこその「環境構築」です。
これを機に環境設定のENVファイルと設定のConfiguファイルの違いを把握しましょう。

環境構築の目標

環境構築の目標は「Dockerによる仮想環境で、Laravelを使用できるようにする」ことです。
具体的には以下の構成で環境構築をします。

Laravelとフレームワーク

Laravelとは

Laravel(ララベル)とは、PHPのフレームワークです。

手軽で扱いやすく、代表的なPHPフレームワークの1つとして認識されています。PHPフレームワークのSymphony(シンフォニー)を基に開発されたため、これまでのタイプに慣れている方でも比較的扱いやすい仕様となっています。

PHPフレームワークの中では、フレームワークサイズ・学習コストの両面で中間的な立ち位置にあるため、「ちょうど良い」と評されています。

フレームワークとは

フレームワークとは、アプリケーション開発の際に土台となるソフトウェアのことです。

アプリケーションの枠組み・骨組み・構造部になるため、一般的にはフレームワーク内に必要な機能を追加しながら開発を進めます。Webアプリケーションフレームワークやユーティリティ系フレームワークなど、用途に応じていくつかの種類が存在しています。さらに、高い汎用性・充実した機能性・限定的な機能で軽量など様々なタイプがあります。

Laravelの特徴

Laravelは下記の11個の特徴を持ったフレームワークです。

  1. 世界で最も人気のPHPフレームワーク
  2. Symphony(シンフォニー)を土台に作成されている
  3. MVCモデルを採用している
  4. 機能やプラグインの開発が盛んである
  5. 学習コストが中程度で教材が豊富で学習がしやすい
  6. Composerでパッケージ管理できる
  7. 拡張性と自由度が高い
  8. データベースの操作が容易である
  9. コマンドツールによって設定や更新が簡単である
  10. バリデーションチェックを自動でやってくれる
  11. Viewに軽量なテンプレートが使われている

これらの特徴により愛され人気を得ているフレームワークなのです。
より詳しく特徴を知りたい方は下記のサイトをご覧ください。
とても分かりやすく易く参考になります。

https://www.acrovision.jp/career/?p=2776

①Laravelを導入する

さっそくLaravelを導入していきましょう!下記の手順を実施してください。

  1. ルートディレクトリを作成する

任意のディレクトリに「Laravel9-Docker-TestPJ」を作成します。

Terminal
$ mkdir Laravel9-Docker-TestPJ
~Laravel9-Docker-TestPJ $ cd Laravel9-Docker-TestPJ
  1. docker-compose.ymlファイルを作成して編集する

docker-compose.yml は Docker Compose を利用するために使用するYMLファイルです。

Terminal
$ touch docker-compose.yml
docker-compose.yml の記述内容
docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7.36
    container_name: "mysql_test"
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: mysql_test_db
        MYSQL_USER: admin
        MYSQL_PASSWORD: secret
        TZ: 'Asia/Tokyo'
    # ポートフォワードの指定(ホスト側ポート:コンテナ側ポート)
    ports:
        - 3306:3306
    # コマンドの指定
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    # 名前付きボリュームを設定する(名前付きボリューム:コンテナ側ボリュームの場所)
    volumes:
      - db_data_test:/var/lib/mysql
      - db_my.cnf_test:/etc/mysql/conf.d/my.cnf
      - db_sql_test:/docker-entrypoint-initdb.d

  php:
    build: ./docker/php
    container_name: "php-fpm"
    # ボリュームを設定する(ホスト側ディレクトリ:コンテナ側ボリュームの場所)
    volumes:
      - ./src:/var/www

  nginx:
    image: nginx:latest
    container_name: "nginx_test"
    # ポートフォワードの指定(ホスト側ポート:コンテナ側ポート)
    ports:
      - 80:80
    # ボリュームを設定する(ホスト側ディレクトリ:コンテナ側ボリュームの場所)
    volumes:
      - ./src:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    # サービスの依存関係を指定(nginxをphpに依存させる)
    depends_on:
      - php

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: "phpmyadmin_test"
    environment:
      - PMA_ARBITRARY=1 # サーバ設定:サーバーをローカル以外も指定
      - PMA_HOST=db # ホスト設定:dbを指定
      - PMA_USER=admin # 初期ユーザー設定:adminを指定
      - PMA_PASSWORD=secret # 初期PW設定:secretを指定
    # db(サービス名)とのリンクを設定する
    links:
      - db
    # ポートフォワードの指定(ホスト側ポート:コンテナ側ポート)
    ports:
      - 8080:80
    # ボリュームを設定する(ホスト側ディレクトリ:コンテナ側ボリュームの場所)
    volumes:
      - ./phpmyadmin/sessions:/sessions

  node:
    image: node:14.18-alpine
    container_name: "node14.18-alpine"
    # コンテナ内の標準出力とホストの出力を設定:trueを指定
    tty: true
    # ボリュームを設定する(ホスト側ディレクトリ:コンテナ側ボリュームの場所)
    volumes:
      - ./src:/var/www
    # コンテナ起動後のカレントディレクトリを設定
    working_dir: /var/www

# サービスレベルで名前付きボリュームを命名する
volumes:
  db_data_test:
  db_my.cnf_test:
  db_sql_test:
  1. ルートディレクトリ直下に ¥docker ¥src を作成する
Terminal
~Laravel9-Docker-TestPJ $ mkdir docker && mkdir src
  1. ¥docker 直下に ¥php ¥nginx を作成する
Terminal
~Laravel9-Docker-TestPJ $ cd docker
~docker$ mkdir php && mkdir nginx
  1. ¥php 直下に Dockerfile php.ini を作成して編集する
Terminal
~docker $ cd php
~php $ touch Dockerfile && touch php.ini
Dockerfile の記述内容

Dockerfileとは
Dockerfileは、Dockerコンテナをビルドするための指示を含むテキストファイルです。

Dockerfileを使用することで、特定の環境でアプリケーションを実行するために必要な手順を自動化することができます。

Dockerfileは、コンテナ内にどのようなファイルや設定を配置するか、どのベースイメージを使用するか、どのコマンドを実行するかなど、コンテナの構築に関する情報を提供します。

Dockerfile
# Dockerimage の指定
FROM php:8.0-fpm
COPY php.ini /usr/local/etc/php/

# Package & Library install
RUN apt-get update \
    && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
    && docker-php-ext-install zip pdo_mysql

# Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

# WorkDir Path setting
WORKDIR /var/www

# Laravel Package install
RUN composer global require "laravel/installer"
php.ini の記述内容

php.iniとは
php.ini は、PHPの設定ファイルであり、PHPの動作や機能をカスタマイズするための設定を含むファイルです。PHPの挙動を細かく制御するためには php.ini ファイルを使用します。

php.ini
; 日付設定
[Date]
date.timezone = "Asia/Tokyo"
; 文字&言語設定
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
  1. ¥nginx 直下に default.conf を作成して編集する
Terminal
~php $ cd ..
~docker $ cd nginx && touch default.conf
default.conf の記述内容
default.conf
server {
    listen 80;
    index index.php index.html;
    root /var/www/LaravelTestProject/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
default.conf の解説

default.conf は、Nginx(エンジンエックス)ウェブサーバーソフトウェアの設定ファイルの1つです。Nginxは、さまざまなウェブサーバー関連の機能を提供するためのソフトウェアです。

default.conf
server {
    # nginx側のポート番号を指定(ymlのnginxのコンテナ側ポートと同じにする)
    listen 80;

    # indexファイルのファイル名と形式を指定(index.php, index.htmlを指定)
    index index.php index.html;

    # サーバー側のルートPathを指定(ymlのphpのvolumesのtopPage位置と同じにする)
    root /var/www/LaravelTestProject/public;

    # locationディレクティブ:HTTPリクエストパスに応じたコンテキストを定義する
    # ここではlocationディレクティブのマッチングを行います
    location / {
        # try_files:左から指定した順番で URL の確認および転送を行う指示を出せる項目
        # ( 1 ) $url → URL のパスにファイルがあるか 
        # ( 2 ) $uri/  ( 1 ) が存在しなかった場合に、URL のパスにディレクトリがあるか 
        # ( 3 ) /index.php ( 1 ) ( 2 ) 共に存在しなかった場合、指定したロケーションに行く
        try_files $uri $uri/ /index.php?$query_string;
    }

    # locationディレクティブ: 「.php 」拡張子のファイルを指定された際に実行した結果に応じたコンテキストをで定義する
    # fastcgi_passの 'php'部分 は、docker-compose.ymlの phpサービス名 と同じにすること('php-fpm'などの場合も多い)
    # それ以外は下記のデフォルトのままでOKです
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
  1. Docker を起動してコンテナを作る
Terminal
~nginx $ cd .. && cd ..
~Laravel9-Docker-TestPJ $ docker-compose up -d
  1. コンテナにログインする(シェル内でコンテナ操作できるようになります)
Terminal
~Laravel9-Docker-TestPJ $ docker-compose exec php bash
  1. Laravelをインストールする

今回は Composer を使用してインストールしています。

Terminal
root@~/www# composer create-project "laravel/laravel=9.*" LaravelTestProject
  1. Composerのオートロード設定を変更する

Laravel9以降はモデルのディレクトリ構成がVersion8未満と異なっています。
下記のようにオートロード設定を追加してください。

composer.json
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "App\\Models\\": "app/Models/",
        [中略]
    }
},
  1. インストールの確認をする
Terminal
root@~/www# cd LaravelTestProject
root@~LaravelTestProject # php artisan --version
Laravel Framework 9.52.15
# Composerのオートロードを再実行しておく
root@~LaravelTestProject # composer dump-autoload
  1. ブラウザでLaravelの表示を確認する

ブラウザに http://localhost/ でアクセスして表示されればOKです。

  1. 念の為に権限を与える(「12」でエラーが出た場合の対応などのため)
Terminal
# PermissionDeniedエラーの対処方法
root@~LaravelTestProject # chown ./www-data/storage -R
  1. ブラウザでLaravelの表示を確認する

ブラウザに http://localhost/ でアクセスして表示されればOKです。

  1. コンテナからログアウトする
Terminal
root@~LaravelTestProject # exit

これで「①Laravelを導入する」は完了です。

とりあえず、Laravelを起動させて表示を確認する ことを目的とする場合はこれで終わりです。
まずは、お疲れ様でした。

このまま データーベース と phpMyAdmin の設定を済ませて開発に進みたい方は「⑤本格的なENV設定」までスキップしてください。

②テストページを作成する

次はテストページを作成してみましょう。目標は Hello world を表示させることです。

MVCモデルとは

テストページを作成する前に Laravel で採用されている MVCモデル を確認しておきましょう。

MVCモデル とは、プログラムを役割ごとにModel(モデル)・View(ビュー)・Controller(コントローラー)の3つに分けて管理するソフトウェア設計モデルのことです。

Model(モデル)とは
システム内部のビジネスロジックを担当する部分です。

DBとデータをやり取りしたり、データの登録・更新・削除などの処理を行います。

DBから取得したデータや処理の結果はControllerに送ります。

View(ビュー)とは
表示や入出力などのユーザーが実際に見る画面(UI)を担当する部分です。

リクエストデータをControllerに送ったり、Controllerからレスポンスデータを受け取って画面に表示したりします。

Controller(コントローラー)とは
ユーザーの入力に基づいてモデルとビューを制御(橋渡し)する役目を担う部分です。

ユーザーが入力した情報に基づいて、モデルへデータを取り出す指示を、ビューにはモデルで取り出したデータを元に画面を表示する指示を出します。

詳しく知りたい方は下記のサイトが分かり易くておすすめです。
https://system-kaihatu.com/archives/3204

テストページを作成する

【目標】hello world を表示させる
それではテストページを作成してきましょう。下記の手順を実施してください。

  1. コンテナにログインする
Terminal
~Laravel9-Docker-TestPJ $ docker-compose exec php bash
root@~/var/www# cd LaravelTestProject
  1. ルーティングを設定する

ルーティングは、どのURLに対してどのコードを実行するかを定義する仕組みです。

[LaravelTestProject\routes\web.php]を下記の通りに編集します。

web.php の記述内容

routes/web.phpとは
routes/web.php ファイルで、Laravelプロジェクト内のルーティングを定義します。このファイルには、ウェブアプリケーションの異なるページやアクションに対するURLパスと、それに対応する処理を指定します。

具体的には routes/web.php ファイルで ルート(Route)を定義します。ルートは、HTTPメソッド(GET、POST、PUT、DELETEなど)とURLパスを指定し、それに対応するコントローラーのアクションやクロージャを関連付けます。例えば、特定のURLにアクセスしたときにどのコントローラーのアクションを実行するかを定義します。

routes/web.php
<?php

use Illuminate\Support\Facades\Route;
/* HelloController クラスの名前空間のインポート文を追加する */
use App\Http\Controllers\HelloController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

/* Laravel welcome Page */
Route::get('/', function () {
    return view('welcome');
});
/* hello world page(ルーティングを追加する) */
Route::get('/hello', [HelloController::class,"index"]);
  1. コントローラーを作成して編集する

MVCのController(コントローラー)とは ユーザーの入力に基づいてモデルとビューを制御(橋渡し)する役目を担う部分です。ユーザーが入力した情報に基づいて、モデルへデータを取り出す指示を、ビューにはモデルで取り出したデータを元に画面を表示する指示を出します。

まずはターミナルでコントローラーを作成します。

Terminal
# コントローラーを作成する
root@~LaravelTestProject# php artisan make:controller HelloController

次に作成した[LaravelTestProject\app\Htttp\Controllers\HelloController.php]を編集します。

HelloController.php の記述内容
HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    // hello world page(メソッドを追加する)
    public function index()
    {
        // view(hello.blade.php)を呼び出す処理
        return view('hello');
    }
}
  1. bladeファイルの作成と編集をする

ブレード(Blade)とは、Laravelでビュー(View)を作るために用意されたテンプレートエンジン です。

MVCの View(ビュー)とは 表示や入出力などのユーザーが実際に見る画面(UI)を担当する部分です。 リクエストデータをControllerに送ったり、Controllerからレスポンスデータを受け取って画面に表示したりします。

まずはターミナルでブレードファイルを作成します。

Terminal
# hello.blade.php を作成する
root@~LaravelTestProject# cd resources/views && touch hello.blade.php

次に作成した[resources/views/hello.blade.php]を編集します。

hello.blade.php の記述内容
hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>My First Page</title>
</head>
<body>
    <h2>Hello World</h2>
</body>
</html>
  1. アクセスして表示を確認する

ブラウザに http://localhost/hello でアクセスして「Hello World」が表示されればOKです。

  1. コンテナからログアウトする
Terminal
root@~views#  # exit

これで「②テストページを作成する」は完了です。

ここから先のセクションについては環境設定の理解を深めるためのものです。
環境設定の理解を深めたいという方はもう一踏ん張りですので頑張っていきましょう。

③設定ファイルを作成する

Laravelでは、アプリ本体は configファイルを経由して .envファイルの情報を読み込みます。

この理由は、.env ファイル の設定情報を直接読み込むのは危険だからです。

直接 .env ファイルを読み込んだ方が手っ取り早いように思えますが問題が起きます。例えば、コンフィギュレーションキャッシュ(config:cache)というコマンドを使うと .env ファイルを読み込めなくなるのは良くあることです。とても危険ですよね。

configファイルを経由していれば 「.env ファイルを読み込めなくなる」ようなことは起きません。これがconfig 経由で情報を読み込む理由です。

.envファイルとconfigファイル

.env ファイルと config ファイルでは役割が違います。どちらも似たようなものに感じるかもしれませんが実は違うのです。それぞれの違いを見ていきましょう。

.envファイルとは

.env ファイルは環境設定ファイルとも呼ばれます。envは、environment(環境)の省略です。

このファイルには データベースの名前、APIキー、メール送信のための情報 などを追加します。登録された情報は環境によって変える可能性があります。たとえば開発環境でのデータベースと本番環境でのデータベースは変更される場合などです。

configファイルとは

config は、configuration(構造、設定)の省略です。

configの内容は環境が変わっても変わりません。つまり、「環境」が変わっても「構造や設定」が維持されるのです。これがconfig 経由で情報を読み込む理由です。
この config ファイルはconfigフォルダの中に入っています。

.envファイルとconfigファイルの役割と、なぜこの流れが必要なのかは、下記のサイトで詳しく解説されていますので一読しておいてください。
https://biz.addisteria.com/env_config/

.env & config の基礎と理解

.env & config の基礎を理解するには、実際に設定ファイルを書いて動かすのが一番です。

ここでは、エラー画面を「500 | Server Error」に変更することを目標にしていきます。そのために、.envファイルにあるAPP_DEBUGの値を変えてみることにします。ついでに config にも触れてみましょう。

.env ファイル内の APP_DEBUG はデフォルトでは true に設定されています。APP_DEBUG はLaravelにアクセスしている時にプログラムの記述ミスやバグがあった場合に原因を究明するために必要となるエラーメッセージの詳細情報を出力してくれます。

.envファイルの基礎を理解するのはとても難しいです。下記のサイトを参照しながら「設定ファイルを作成する」ことをおすすめします。
https://reffect.co.jp/laravel/env-file-basic-understanding/

設定ファイルを作成する

【目標】エラー画面を「500 | Server Error」に変更する

  1. コンテナにログインする
Terminal
~Laravel9-Docker-TestPJ $ docker-compose exec php bash
root@~/var/www# cd LaravelTestProject
  1. bladeファイルにエラーコードに書き換える
resources/views/hello.blade.php の記述内容
hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>500 | Server Error</title>
</head>
<body>
    <h1>Laravel ENV FILE</h1>
    {{-- わざとスペルミスしています --}}
    <p>{{ $somethig }}</p>
    
</body>
</html>
  1. コントローラーを書き換える
[app/Http/Controllers/HelloController.php] の記述内容

このコントローラーからViewの <p>{{ $somethig }}</p> に値を渡します。

HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    // hello world page(メソッドを追加する)
    public function index()
    {
        /* view(hello.blade.php)を呼び出す処理 */
        return view('hello',["something"=>"FBK"]);
    }
}
  1. ブラウザでLaravelの表示を確認する

ブラウザに http://localhost/hello でエラーが表示されればOKです。

  1. .env ファイルの設定を変更する
.env
APP_DEBUG=false
  1. 設定変更を反映させるためキャッシュをクリアする
    .env ファイルは一度ロードされてキャッシュされるとenvヘルパー関数を実行しても値はNULLになり画面にはなにも表示されません。その場合は php artisan config:clear を実行してください。
Terminal
root@~LaravelTestProject # php artisan config:clear
  1. アクセスして表示を確認する

ブラウザに http://localhost/hello でエラーが表示されればOKです。

最後にエラーを出さないようにしてみましょう。

resources/views/hello.blade.php の記述内容

コントローラーの something と一致するようにスペルを修正します。

hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>500 | Server Error</title>
</head>
<body>
    <h1>Laravel ENV FILE</h1>
    {{-- スペルミスを修正する --}}
    <p>{{ $something }}</p>
    
</body>
</html>

ブラウザに http://localhost/hello で FBK が表示されればOKです。

  1. env関数を使ってみる(.envの現在の値を確認する)

[resources/views/hello.blade.php] を書き換えてください。

resources/views/hello.blade.php の記述内容
hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>500 | Server Error</title>
</head>
<body>
    <h1>Laravel ENV FILE</h1>
    <p>{{ env('DB_CONNECTION')}}</p>
</body>
</html>
  1. アクセスして表示を確認する

ブラウザに http://localhost/hello で mysql が表示されればOKです。

9. config関数を使ってみる

[resources/views/hello.blade.php] を書き換えてください。

resources/views/hello.blade.php の記述内容
hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>500 | Server Error</title>
</head>
<body>
    <h1>Laravel ENV FILE</h1>
    <p>{{ config('database.default') }}</p>
</body>
</html>

  1. アクセスして表示を確認する

ブラウザに http://localhost/hello で mysql が表示されればOKです。

11. 独自configファイルを作成して編集する

まずは、config/example.php を作成します。

Terminal
root@~LaravelTestProject # cd config && touch example.php

次に、config/example.php を編集します。

config/example.php の記述内容
example.php
<?php

return [
    // テスト用のconfigファイルのkey設定をする
    'key' => env('EXAMPLE_APP_KEY', 'EX_APP_KEY'),
];

次に、.env ファイルを編集します。

.env の記述内容

.env の末尾に EXAMPLE_APP_KEY を追加してください。

.env
EXAMPLE_APP_KEY = 123456789ABCDEF

次に、[resources/views/hello.blade.php] を書き換えてください。

resources/views/hello.blade.php の記述内容
hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>500 | Server Error</title>
</head>
<body>
    <h1>Laravel ENV FILE</h1>
    <p>{{ env('EXAMPLE_APP_KEY')}}</p>
    <p>{{ config('example.key')}}</p>
</body>
</html>
  1. アクセスして表示を確認する

ブラウザに http://localhost/hello で 123456789ABCDEF が表示されればOKです。
無事に .envconfig の設定が反映されていることが分かります。

  1. 開発中なので.env ファイルの設定を戻す
.env
APP_DEBUG=true
  1. コンテナからログアウトする
Terminal
root@~LaravelTestProject # exit

これで「③設定ファイルを作成する」は完了です。

ここまでの学習で.envconfig について理解が深まったのではないでしょうか。
次回からは、本番環境と開発環境を切り替えを学んでいきます。

④本番環境と開発環境

  1. コンテナにログインする
Terminal
~Laravel9-Docker-TestPJ $ docker-compose exec php bash
root@~/var/www# cd LaravelTestProject
  1. 現在の設定値を確認する
Terminal
root@~LaravelTestProject # php artisan env
[中略]
    # local(開発)環境であることが分かります
   INFO  The application environment is [local].  
  1. 本番環境に切り替える

まずは .env の下記の部分を書き換えてください。

.env
APP_ENV=production

次に、[resources/views/hello.blade.php] を書き換えます。

resources/views/hello.blade.php の記述内容
hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>500 | Server Error</title>
</head>
<body>
    <h1>Laravel ENV FILE</h1>

    <?php

        if (App::environment('local')) {
            // 環境が local(開発)の場合
            echo "開発環境(ローカル)です";
        }elseif(App::environment('development')) {
            // 環境が development(開発)の場合
            echo "開発環境です";
        }elseif(App::environment('production')) {
            // 環境が production(本番)の場合
            echo "本番環境です";
        }else{
            // その他の環境
            echo "その他の環境です";
        }

    ?>
</body>
</html>
  1. アクセスして表示を確認する

ブラウザに http://localhost/hello で 本番環境です が表示されればOKです。
その他にも.envAPP_ENV の値を 色々(local, development, production)と変えてみましょう。


  1. .env の設定を元に戻す
.env
APP_ENV=local
  1. コンテナからログアウトする
Terminal
root@~LaravelTestProject # exit

これで「④本番環境と開発環境」は完了です。

ここまでの学習で 本番環境と開発環境の切り替え について理解が深まったのではないでしょうか。
次回からは、Laravelのための本格的なENV設定を学んでいきます。

⑤本格的なENV設定をする

Laravelは、フルスタックフレームワークです。フロントエンドもバックエンドも網羅したタイプのフレームワークです。今まで何も設定していなくても動いていたのはデフォルトの設定の範囲で問題のない機能の実装でしかなかったからです。

実際のところ、このセクションで行う内容も初期設定で動いてしまいます。しかし、それでは Dokcerファイル に合わせた設定に触れずに終わってしまいます。

例えば、Laravel側でテーブル定義をしてテーブルを作成する機能をマイグレーションと呼びます。この機能を使うには適切に .env を設定しておかないといけません。そのためにも「Dockerに合わせたENV設定」をしっかりと身につけておきたいところです。

ここでは理解を深めるためにも 「Dockerに合わせたENV設定」 を学んでいきます。

本格的なENV設定をする

【目標】hello world を表示させる, phpMyAdminに接続する
さっそく本格的なENV設定をしていきましょう。

今までの作業では直接 .env に記述してきましたが、ここからは .env.exampleに記述していきます。その理由は巻末の「超重要」のトピックをご覧ください。

この作業では phpMyAdmin は必須なので念のために再ビルドを実行しておきます。
特にGithubでコード管理してる方などは phpMyAdmin はリモートブランチに push されないので注意しましょう。

Terminal
# Dockerで再ビルドする
~Laravel9-Docker-TestPJ $ docker-compose up -d
  1. コンテナにログインする
Terminal
~Laravel9-Docker-TestPJ $ docker-compose exec php bash
root@~/var/www# cd LaravelTestProject
  1. .env.env.example にコピーする
Terminal
root@~LaravelTestProject # cp .env .env.example
  1. .env.example の設定を書き換える

URL設定を localhost に変更する

.env.example
APP_URL=http://localhost

DBの設定を変更する(DB_HOSTは localhost だと接続されない時がある)

.env.example
# 値は docker-compose.ymlファイルと同じにする
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=mysql_test_db
DB_USERNAME=admin
DB_PASSWORD=secret

「④本番環境と開発環境」を実施している人は 不要な設定とファイルを削除する(後始末する)

.env.example
EXAMPLE_APP_KEY = 123456789ABCDEF
  1. .env.example.env にコピーする

理由は後述しますが .env.example に記述して .env に反映させるのは開発のセオリーです。

Terminal
root@~LaravelTestProject # cp .env.example .env
# キージェネレートする
root@~LaravelTestProject # php artisan key:generate
.env.example の全体コード
.env.example
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:uDselircjsSAkOadnmIwVxEsTnkjQKjncsDmbLgA05s=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=mysql_test_db
DB_USERNAME=admin
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1

VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
  1. configフォルダの不要な example.php を削除する
Terminal
root@~LaravelTestProject # cd config && rm example.php
  1. アクセスして表示を確認する

ブラウザに http://localhost/hello で 開発環境(ローカル)です が表示されればOKです。
Dcokerファイルに合わせたENV設定は問題ないことが確認できました。

ブラウザに http://localhost:8080/ で phpMyAdmin が表示されればOKです。
phpMyAdmin が表示されているなら MySQL(DB)も phpMyAdmin 問題なく稼働しています。

  1. コンテナからログアウトする
Terminal
root@~config # exit

.env.example について

これで「⑤本格的なENV設定をする」は完了です。

ここまでの学習で Dockerを使ったENV設定 や データーベースを使うためのENV設定の方法を理解できたと思います。

後始末をする

今回で使ったDockerコンテナなど学習用のものは普段は必要ないので消してしまいましょう。
Dockerを使っているので必要になったら、またビルド(構築)すれば良いだけです。
どんなコードを書いていたかを確認したいのであれば本記事を確認すれば済みます。

  1. サービスに関連するコンテナ, イメージ, ボリュームを全て削除する
Terminal
~Laravel9-Docker-TestPJ $ docker-compose down -v --rmi all
サービスに限定しないで一括で消す場合
Terminal
# コンテナを停止する
~Laravel9-Docker-TestPJ $ docker-compose stop
# コンテナの一括削除
~Laravel9-Docker-TestPJ $ docker rm $(docker ps -aq)
# ネットワークの一括削除
~Laravel9-Docker-TestPJ $ docker network prune
# イメージの一括削除
~Laravel9-Docker-TestPJ $ docker rmi $(docker images -q)
# ボリュームの削除
~Laravel9-Docker-TestPJ $ docker volume prune

但し、このコマンドはサービスに限定せずに全ての現在実行中および停止中の全ての コンテナ, ネットワーク, イメージ, ボリューム を一括削除します。そのため、実行する際には慎重に行なってください。例えば、何が起きても困らない自分の学習用PC端末などですべて消したい場合で使用します。

個別に消したい場合
Terminal
# コンテナを停止する
~Laravel9-Docker-TestPJ $ docker-compose stop

# コンテナを確認する
~Laravel9-Docker-TestPJ $ docker ps -a
# 特定のコンテナの削除
~Laravel9-Docker-TestPJ $ docker rm コンテナID (CONTAINER ID)

# ネットワークを確認する
~Laravel9-Docker-TestPJ $ docker network ls
# 特定のネットワークの削除
~Laravel9-Docker-TestPJ $ docker network rm (NETWORK NAME)

# イメージを確認する
~Laravel9-Docker-TestPJ $ docker images
# 特定のイメージの削除
~Laravel9-Docker-TestPJ $ docker rmi イメージID (IMAGE ID)

# ボリュームを確認する
~Laravel9-Docker-TestPJ $ docker images
docker volume ls
# 特定のボリュームの削除
~Laravel9-Docker-TestPJ $ docker volume rm (VOLUME NAME)
  1. 任意でホストPCの今回で使用したフォルダとファイルを消す

ここでの操作ついては個々人の判断にお任せします。
本記事をみれば良いと思ってる人はフォルダとファイルも消してしまいましょう。

Terminal
# 親ディレクトリに移動
~Laravel9-Docker-TestPJ $ cd ..
~親ディレクトリ名 $ rm -rf Laravel9-Docker-TestPJ

これで「後始末をする」は完了です。

まとめ

これで全ての作業が完了しました。お疲れ様でした。

ここまでの作業で「LaravelのENVとConfigの違い」を概ね理解できたのではないでしょうか。
.env ファイルに新規情報を加えたら、config ファイルを通じて読み込みましょう。
それぞれに異なる役割が与えられているので適切に使い分けていきたいところです。

本記事がその一助になればと思っております。

GitHubで編集を提案

Discussion