LaravelとDockerでプロジェクトを始めるときに見るメモ


12/19 phpstorm用の設定について追記

# 概要
Laravelで新規プロジェクトを立ち上げる機会が多くなり、
毎回「最初にこれ考えとけばよかった！」ってのが出てくるので、まとめて見ました！

以下の環境で作ります。

- Mac
- Laravel 5.7
- Laradock
- heroku

# 開発の進め方
以下の手順で進めていきます。

- 開発環境構築
- Laravelで開発前に決めておくべきこと
- DBマイグレーションファイルの作成
- Seederの作成
  - リレーションを意識してSeederを最初に作っておくと以下の利点があります。
    - DB設計不備を発見できる。型やサイズ、リレーションなど。
    - Modelにリレーションを記述する必要があるので、開発中に同時にModelに手が入る事が少なくなる。
    - リレーションのサンプルが出来るので、それを参考にメンバーが開発しやすくなる。
- 開発
- デプロイ

# 開発環境構築
Laradockを利用します。
Vagrantで構築するより軽いのと、ミドルウェアを疎結合にして、実際の本番環境の近づけるためです。

サンプルはこちら
https://github.com/naoki0531/template-laravel

## 構成
本番へアップするソースになるべく不純物を入れたくないので、以下のような構成にします。
開発環境用リポジトリを作り、srcフォルダ内へLaravelのソースリポジトリをクローンする形にします。

開発環境用リポジトリ
└ laradock/
└ src/
└ data/

| ファイル名       |       用途 |
|:-----------------|:------------------|
| aradock/             |              laradockリポジトリ |
| src/           |            Laravelのソースリポジトリ |
| data/             |              mysqlなどのデータ永続化フォルダ |
| README.md               |                手順を記載 |
| .env.laradock               |                laradock用の.envファイル |

## 前準備
- git
- docker for mac
- docker-compose
- 開発環境用リポジトリ
- Laravelソースリポジトリ

## 開発環境用リポジトリの作成
```bash
$ mkdir {プロジェクト名}
$ cd {プロジェクト名}
$ git init
```

### 永続化dataディレクトリの作成
laradockで実行されるmysqlなどのデータがここに格納されます。

```bash
$ mkdir data
$ touch data/.gitkeep
```

### gitignore作成
dataディレクトリの直下のデータとsrcディレクトリをgitの管理外へ。
他、エディタの設定ファイルなどあればここへ追加。

```bash
$ vi .gitignore
```
```
src
data
!data/.gitkeep

# phpstormの設定ファイル
.idea
```

### envファイル作成
手順をなるべく減らしたいので、laradockの.envの雛形を開発用リポジトリに入れておきます。

```bash
$ git submodule add https://github.com/laradock/laradock.git
$ cp laradock/.env.example .env.laradock
$ vi .env.laradock
```

```
# ソースと永続化データフォルダのパス変更
APP_CODE_PATH_HOST=../src
DATA_PATH_HOST=../data

# NGINXのポートを変更
NGINX_HOST_HTTP_PORT=8080

# MYSQL
MYSQL_DATABASE={データベース名}
MYSQL_USER={ログインユーザー名}
MYSQL_PASSWORD={パスワード}
```

### READMEの作成
上から実行していくだけで環境が見れる状態を作ります。

```bash
$ vi README.md
```
バックスラッシュは削除してください。

```
# initial setting
\```bash
$ git clone {開発環境用リポジトリURL} {開発環境用ディレクトリ}
$ cd {開発環境用ディレクトリ}
$ git submodule init
$ git submodule update
$ git clone {Laravelのソースリポジトリ} src
$ cp src/.env.example src/.env
$ cp .env.laradock laradock/.env
$ cd laradock
$ docker-compose up -d --build nginx mysql workspace
$ docker-compose exec workspace composer install
$ docker-compose exec workspace npm install
$ docker-compose exec workspace php artisan key:generate
\```
http://localhost:8080/
```

### 以下のファイルをコミット
```
.env.laradock
.gitignore
.gitmodules
README.md
data/.gitkeep
laradock
```

## Laravelリポジトリの作成
### laradock実行
```bash
$ cp .env.laradock laradock/.env
$ cd laradock
$ docker-compose up -d --build nginx mysql workspace
```

### Laravelプロジェクトの作成
```bash
$ docker-compose exec workspace composer create-project laravel/laravel .
```

### Laravelソースリポジトリへコミット
```bash
$ cd ../src
$ git init
$ git add .
# 以下省略
```

## 動作確認
```bash
$ cp .env.example .env
$ cd ../laradock
$ docker-compose exec workspace composer install
$ docker-compose exec workspace php artisan key:generate
```

http://localhost:8080/

# Laravelで開発前に決めておくべきこと
## Modelの場所
![スクリーンショット 2018-10-13 17.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/58712/c2af92fc-6515-9161-babd-d96a6aa54c47.png)

デフォルトではこの位置ですが、自分は好みで`Models`フォルダを作成してそこへ格納しています。

以下のようにnamespaceの修正を忘れずに。

```php:User.php
<?php

namespace App\Models;

// ・・・
```

## Serviceクラスの有無
正解はありませんので、アプリ特性を考えて作るか作らないか判断すべきかと思います。
WEBやAPIなどで使い回すロジックが多い場合は作ったほうが良いかもしれません。

## ViewComposerの利用

## FormValidationの利用

# データベース
Laravelのmigrationを利用します。
直接作成するのではなく、Laravelのライブラリを利用して、DBから自動生成する形を取りたいと思います。

## 準備
まずDBを作るためのER図を[MysqlWorkBench](https://www.mysql.com/jp/products/workbench/) を利用して作成します。

- [File] > [New Model] > [Add Diagram] を選択。
- 左カラムの [mydb] をダブルクリックして、データベース名を`.env`で指定したものに変えておきましょう。

![スクリーンショット 2018-10-13 12.15.06.png](https://qiita-image-store.s3.amazonaws.com/0/58712/e5d863a1-89a2-ae04-1863-d2b0eb1a95f8.png)

## ER図の作成
画像のアイコンをクリックし、作成していきます。

![スクリーンショット 2018-10-13 12.18.21.png](https://qiita-image-store.s3.amazonaws.com/0/58712/4590d661-58d2-ed04-3ca3-5b9ff32766ec.png)

必ずこうしなければならないというわけではないですが、わかりやすいのでORMのデフォルトルールに従って作っていきましょう。

- データベース名は複数形にする。
- 中間テーブル以外はAutoincrementのidカラムを作る。
- アプリケーションの利用で増えていくテーブルには`created_at`、`updated_at`、`deleted_at`をつけておく。
- 中間テーブルはORMの`detach`で物理削除されるのでtimestamp系はつけない。

![スクリーンショット 2018-10-13 17.31.18.png](https://qiita-image-store.s3.amazonaws.com/0/58712/9fe9067f-6a84-9ee7-ad2e-7b4566c67d75.png)


## ER図からDBにテーブルを作成
- [Database] > [Forward Engineer] を選択
- DBの接続情報を入力して進めると、テーブルが作成されます。

![スクリーンショット 2018-10-13 17.21.11.png](https://qiita-image-store.s3.amazonaws.com/0/58712/aca849cd-ca55-9b6c-88b7-ed92e13a120e.png)

できました！

## DBからmigrationファイルを作成
- デフォルトで用意されているuserのマイグレーションファイルを削除。

```bash:src
$ rm database/migrations/2014_10_12_000000_create_users_table.php
```

- `Laravel Migrations Generator`のインストール

```bash:laradock
$ docker-compose exec workspace composer require --dev "xethron/migrations-generator"
```

- `app/Providers/AppServiceProvider.php`へ追記

```php:AppServiceProvider.php
    public function register()
    {
        if ($this->app->environment() !== 'production') {
            $this->app->register(\Way\Generators\GeneratorsServiceProvider::class);
            $this->app->register(\Xethron\MigrationsGenerator\MigrationsGeneratorServiceProvider::class);
        }
    }
```

- 作成

```bash:laradock
$ docker-compose exec workspace php artisan migrate:generate
```

- 完成！

![スクリーンショット 2018-10-13 17.42.01.png](https://qiita-image-store.s3.amazonaws.com/0/58712/f57d8a35-2dd5-f743-c56a-c217a4dcac36.png)

- 確認

一応、流せる事を確認しておきましょう。`fresh`で全てのテーブルを削除してから実行してくれます。

```bash:laradock
$ docker-compose exec workspace php artisan migrate:fresh
```


# 開発
## phpstormでlaravel用の設定を行う
ファサードやモデルの補完が行えるようになってとても便利なので入れましょう！

### 必要パッケージインストール
```bash:laradock
$ docker-compose exec workspace composer require doctrine/dbal
$ docker-compose exec workspace composer require barryvdh/laravel-ide-helper
$ docker-compose exec workspace php artisan ide-helper:generate
$ docker-compose exec workspace php artisan ide-helper:model
```

### phpstorm設定
- plugin
[Preferences] > [Plugins]
`Laravel Plugin`を入力してインストール

- エラー対策
ide-helperを使うと、`multiple definitions`エラーが出てしまうので、エラーを抑制します。
[Preferences] > [Editor] > [inspections] > [PHP] > [Undefined] > [Undefined class]
`Don't report・・・`にチェックを入れる。

### 確認
DBのカラム名とファサードが補完できるようになりました！
![スクリーンショット 2018-12-19 18.36.49.png](https://qiita-image-store.s3.amazonaws.com/0/58712/106a95b0-75d6-875d-ffff-4af12c4b463c.png)
![スクリーンショット 2018-12-19 18.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/58712/f0411aae-b34c-1379-dbaf-c603d843b245.png)

※ ファサードやモデルが増えるたびにコマンドを実行し直しておきましょう。


## ログイン画面
特に理由がないならば、LaravelのAuthをカスタムしていくのがとても便利です。

### Auth実行
```bash:laradock
$ docker-compose exec workspace php artisan auth
```

## https対応
ローカルではhttp、
本番ではhttpsにしたいかと思います。
`asset()`関数をそのまま使うと、全てhttpになってしまいますし、
`secure_asset()`などに書き換えるのも面倒です。

そこで以下のファイルを書き換えることで、動的に対応されるようになります。

`app/http/Middlewares/TrustProxies.php`

```php:TrustProxies.php
protected $proxies = '**';
```

# デプロイ
## heroku
簡単に公開できるので、よく利用しています。
herokuで公開する手順。

### procfileの作成
以下のファイルを作成してmasterへコミット。

```bash:laravel/src
$ echo 'web: vendor/bin/heroku-php-apache2 public/' > Procfile
```

### redis用の設定
herokuのredisは接続先が定期的にメンテナンスで変更されます。
自動的に環境変数`REDIS_URL`が修正されますので、それ用の設定変更が必要です。

↓参考
https://qiita.com/sawadashota/items/33659912c882dd73f9ff