【Laravel,MySQL】設定ファイル.env、.env.example、database.phpの違いとは？

#概要
本記事は、[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)で学習している中の疑問・つまづきの備忘録です。

今回はLaravelでDBを利用する際の設定ファイルについてまとめます。
なお、[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。


#設定ファイルはどれを使えばいいのか？

LaravelにはDBを利用する際に使用する、設定に関するファイルが複数あります。
しかし、結局どれを使えばいいのか迷ったので調べてみました。

##.envファイル

このファイルには環境変数が定義されています。
DBに関する設定はデフォルトで以下の通りです。

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=[プロジェクト名]
DB_USERNAME=sail
DB_PASSWORD=password
```

基本的に設定を変更するにはここを書き換えるといいようです。
後述のdatabase.phpでは、env()関数を使用して.envファイルで設定された環境変数を取得しています。
また、以下の通り.envファイルをGitHub等で管理してはいけません。

>アプリケーションを使用する開発者/サーバごとに異なる環境設定が必要になる可能性があるため、.envファイルをアプリケーションのソース管理にコミットしないでください。さらに、機密性の高い資格情報が公開されるため、侵入者がソース管理リポジトリにアクセスした場合のセキュリティリスクになります。
>[Laravel 8.x 設定](https://readouble.com/laravel/8.x/ja/configuration.html#environment-configuration)

ちなみに、デフォルトで.gitignoreファイル内でGitのソース管理対象から外すよう設定されています。

```
#.gitignoreファイル

/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env     ##########ここに設定されている
.env.backup
.phpunit.result.cache
docker-compose.override.yml
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/.idea
/.vscode
```

では、.envの設定項目や設定値をチーム内で共有したい場合はどうすれば良いのか？
.env.exampleファイルを利用しましょう。

##.env.exampleファイル

このファイルに、共有したい設定を記載します。
ただし、本番環境で使用するような設定は記載すべきではないでしょう。
デフォルトでは以下のような設定値になっています。

DB_HOSTやDB_DATABASEの設定項目が.envと異なります。
自分自身を指すIPアドレスである、127.0.0.1が設定されるなど仮に外部に漏れても危険ではない値が設定されているようです。


```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

>チームで開発している場合は、アプリケーションに.env.exampleファイルを含め続けることをお勧めします。サンプル設定ファイルにプレースホルダー値を配置することにより、チームの他の開発者は、アプリケーションを実行するために必要な環境変数を明確に確認できます。
>[Laravel 8.x 設定](https://readouble.com/laravel/8.x/ja/configuration.html#environment-configuration)

##database.phpファイル

こちらがDBの設定ファイルです。
デフォルトでは、ほとんどの項目でenv('.envの設定項目名', 'デフォルト値')関数を用いて環境変数を取得しています。
したがって、.envの内容を書き換えるとenv()関数で取得される値も変わります。


```database.php
//MySQLの設定のみ抜粋

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],

```


>Laravelのデータベースサービスの設定は、アプリケーションのconfig/database.php設定ファイルにあります。このファイルは、全データベース接続を定義し、デフォルトで使用する接続を指定できます。このファイル内のほとんどの設定オプションは、アプリケーションの環境変数の値によって決まります。Laravelがサポートしているデータベースシステムのほとんどの設定例をこのファイルに用意しています。
>[Laravel 8.x データベース：準備](https://readouble.com/laravel/8.x/ja/database.html)


#まとめ
####.env
環境変数を定義する。env()関数を使用するとこのファイルの設定値を取得できる。
また、セキュリティリスクとなるため.envファイルをGitHub等で管理してはいけない。
###.env.example
チーム開発時に、アプリケーションを実行するために必要な環境変数を共有するために使用。
###database.php
DBの設定ファイル。
デフォルトでは多くの項目で、env()関数を使用して.envファイルから環境変数を取得している。

#参考文献
>[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=pd_lpo_1?pd_rd_i=4798060992&psc=1)
>[Laravel 8.x 設定](https://readouble.com/laravel/8.x/ja/configuration.html#environment-configuration)
>[Laravel 8.x データベース：準備](https://readouble.com/laravel/8.x/ja/database.html)