dockerで作った(nginxとphp-fpmとmysqlの連携)環境にいよいよLaravelのプロジェクトを作ったときのメモ


#前提

すでに、nginxとphp-fpmとmysqlのコンテナを連携させた環境は構築できてる。[(dockerで)nginxに関するメモ](https://qiita.com/niibori/items/a68e41a695fd1b1b80a1)、[(dockerで)php-fpmに関するメモ](https://qiita.com/niibori/items/79a4141d4d557897c356)、[(dockerで)mysqlに関するメモ](https://qiita.com/niibori/items/1b8df3c091fde4683388)。
この環境にComposerでLaravelのプロジェクトを作成して、データベースのマイグレーションまで実行したメモ。

##Laravel
2〜3年前くらいに実務でLaravelを使っていた。他にもPHPのフレームワークはあッたのだが、なんとなく新しくてカッコイイ感じがしてLaravelをプロジェクトで採用した。実際、多少制限はあるもののスムーズな開発でプロジェクトは完了した。
今回もあるシステム開発の相談を受けてLaravelを採用する予定。このメモはその環境作りの記録。

##./src/var/www/html
docker-composeによって構築される環境で、nginx（と、php-fpm)コンテナのドキュメントルートは **/var/www/html**としているが、ローカルでは **./src/var/www/html** にマウントされている。

#composer
実はあまり使い慣れていない。composerの使い方を勉強したいと思っているのが正直なトコロ。数年前からPHP周りのことを調べていると何度も **composer**という単語に遭遇するようになった。Laravelのプロジェクトを作成する際もcomposerを利用する手順がオフィシャルページにも紹介されている。



##composer create project ...

composerでプロジェクトを作成するには```composer create project <PROJECT_DIRECTORY_NAME>```を実施する。

**./src/var/www/html**に移動して

```shell:command
composer create-project laravel/laravel projLaravel --prefer-dist
```

./src/var/www/html/ **projLaravel** が出来上がる。今後はこのディレクトリ(パスを含めて)を**\<PROJDIR\>**と表記する。


##--prefer-dist

```--prefer-source``` というオプションもあるらしい(デフォルトはこちら)。違いについて調べていまひとつピンとこなかった。ザックリと


<dl>
<dt>--prefer-source</dt><dd>は、開発利用。gitからソースコードを取得される。</dd>
<dt>--prefer-dist</dt><dd>は、基本安定版。パッケージ化されたバージョン。取得が早い。</dd>
</dl>

といった感じなんだろうか。今は時間をかけていられないので調べるのは後回しとする。

#データベースのマイグレーション
データベースの接続情報やテーブルの情報を設定し、データベースのマイグレーションを実施する。

##テーブル作成
ここはLaravelの使い方の話なのであっさりと。

```shell:command
php artisan make:migration create_samples_table
```

**\<PROJDIR\>/database/migrations/**にマイグレーションファイルが作成される。上記コマンドで生成されたファイル以外にデフォルトで用意されているファイルもあるので不要であれば削除しておく。

##\<PROJDIR\>/config/database.php と \<PROJDIR\>/.env
昔、Laravelを使っていたときは **.env** を見た記憶が無いが、環境毎に異なる情報をまとめておくファイルがあるらしい。 **database.php** を参照すると```env(....)```という記述があり、これと関係しているらしい。

database.phpにはデータベースの接続情報が書かれている。

```php:database.php(一部)

        'mysql' => [
            'driver' => 'mysql',
            '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,
        ],

```

**host** 、 **database** 、 **username** 、 **password** の辺りを変更すれば良さそうな気がしていたが間違え。 **.envで設定がされている場合は、こちらが優先** になるらしい。.envを参照し、接続情報を書き換えておく。

```conf:.env(一部)
DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
DB_HOST=db00
DB_PORT=3306
#DB_DATABASE=homestead
DB_DATABASE=projdb
#DB_USERNAME=homestead
DB_USERNAME=proj
#DB_PASSWORD=secret
DB_PASSWORD=password
```

##マイグレーションを実行する
とりあえず接続情報を設定したので、動くかどうか確かめたい。マイグレーションを実行する。マイグレーションを実行するには\<PROJDIR\>/artisanを実行するのだが、これが要注意。あくまで、実行環境はphp-fpmコンテナ(app)であるということ。ローカルから実行してもデータベースにアクセスすることが出来ずエラーで終わる。

\<PROJDIR\>に移動して

```shell:command
docker-compose exec app php /var/www/html/projLaravel/artisan migrate
```

正しく実行できたか確認するには

```shell:command
docker-compose exec db mysql -u root -p -e "show databases;"
> +--------------------+
> | Database           |
> +--------------------+
> | information_schema |
> | mysql              |
> | performance_schema |
> | samples            | <-- !!
> | sys                |
> +--------------------+
```