【Laravelで個人開発】ローカルに開発環境を作る

# はじめに
このドキュメントは、Laravel初心者の方が、個人開発の第一歩として独力で「ローカルに開発環境を作ること」をゴールに定め書いています。

# ゴールの具体的な状態
- ローカルからブラウザにて`localhost`にアクセスすると、Laravelのデモ画面が表示できる
- デバックモードが有効である
- コードがgithub上にも存在する

# 対象環境
今回はMacに絞って話を進めます。

# インストールするソフトウェア・パッケージ
MacのローカルのPHPのバージョンは最新にします。プロジェクト次第では複数のPHPのバージョンを扱えるようphpenvの導入も検討すべきですが、一旦今回はシンプルに最新化のみ行います。

また、最終的にIaaSに環境作って公開することになるので、ローカルもそれに近い環境が望ましいと考えます。また自分自身にとっても馴染みがあると言う理由でdockerを用いることにします。その場合Laravel公式のlaradockを使うのが一般的ですが、[shipping-docker/vessel](https://github.com/shipping-docker/vessel)の方がdockerそのものを意識せずに済むため、今回はそちらを使用することにします。

LaravelはLTS版(サポート期間が長期のバージョン)であるLaravel6.xを使用します。prestissimoは、日本からcomposerを使ってパッケージをインストールすると遅いため、その解消を目的として導入しています。なぜ「日本から」だと遅くなるかを知りたい場合は、[こちらの資料](https://www.slideshare.net/hinakano/composer-phpstudy)を読んでみてください。また、デバックできないと開発しづらいのでdebugbarもインストールします。今回はAPI開発は一旦スコープ外と考えているので、[itsgoingd/clockwork](https://github.com/itsgoingd/clockwork)は無し。

## インストールするソフトウェア
- PHP7.4
- Docker for Mac
- Composer 1.x

## インストールするパッケージ

- Laravel6.x
- hirak/prestissimo
- shipping-docker/vessel
- barryvdh/laravel-debugbar

# 導入手順
## PHPのアップデート
### 1. homebrewで最新のPHPをインストールする
```bash
brew install php@7.4
```

### 2. パスを通す
```bash
echo 'exportPATH="/usr/local/opt/php@7.4/bin:$PATH"'>>~/.bash_profile
echo 'export PATH="/usr/local/opt/php@7.3/sbin:$PATH"' >> ~/.bash_profile
```

### 3. バージョンを確認する
7.4になっているかどうか

```bash
php -v
```

## Docker for Macのインストール
1. DockerHubに[アカウント](https://hub.docker.com/signup)を作成する
2. DockerHubよりソフトウェアを[ダウンロード](https://hub.docker.com/editions/community/docker-ce-desktop-mac/)する
3. ダウンロードしたファイルを実行する
4. 登録したアカウントをDockerに設定する

## Composerのインストール
### 1. Composerをダウンロードする
``` bash
cd ~
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```

### 2. Composerファイルの安全性をチェックする
``` bash
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
```

### 3. Composerをインストールする
```bash
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

### 4. Globalで使用できるようにする
```bash
mv composer.phar /usr/local/bin/composer
```

## hirak/prestissimoのインストール
後続のLaravelとvesselのインストールをスムーズに行うため、このタイミングでインストールしておきます。

```bash
composer global require hirak/prestissimo
```

## Laravel6.xのインストール
### 1. バージョンを指定してLaravelをインストールする
最新のLaravelのバージョンは7.xなので、バージョンを指定してインストールしないと6.xをインストールできない。このため下記のようにします。project名は任意。ローカル開発環境では複数のプロジェクトを扱うことも多いため、 `projects` のような親ディレクトリを作ってその中でインストールすることがお勧めです。

```bash
mkdir projects
cd projects
composer create-project "laravel/laravel=6.*" project名
```

### 2. Laravelのバージョンを確認する
```bash
cd project名
php artisan --version
```

## vesselをインストール
### 1. composerを使ってインストールする

```bash
composer require shipping-docker/vessel --dev
```

### 2. vesselを初期化する
``` bash
php artisan vendor:publish --provider="Vessel\VesselServiceProvider"
bash vessel init
```

### 3. vesselを起動する
```bash
./vessel start
```

### 4. localhostにアクセスする
ブラウザのURLに `localhost` を入力し、下記の画面が表示されることを確認します。
![laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/3f2c994a-bfea-bd04-9797-8984310745ea.png)


## その他のパッケージのインストール
### 1. vesselの環境を通してインストールする

```bash
./vessel comp require hirak/prestissimo
./vessel comp require barryvdh/laravel-debugbar --dev
```

### 2. localhostにアクセスする
ブラウザのURLに `localhost` を入力し、下記のように画面下にdebugbarが表示されることを確認します。
![スクリーンショット 2020-06-20 11.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/7a29b5ad-9675-83b2-1d4f-e87a7ac72c2f.png)


## githubにコードを置く
今回は事前にgithub上に空のリポジトリ(リモートリポジトリ)を用意しているものとします。また、リポジトリ名は先のプロジェクト名と同じものとします。

### 1. gitを初期化する

```bash
git init
```

### 2. ローカルリポジトリにコミットする
```bash

git add -A .
git commit -m 'first commit'
```

### 3. リモートリポジトリのパスをコピーする
![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/7eeba8a8-d759-d109-e12c-17bbebc169bb.png)



### 4. リモートリポジトリにプッシュする
```bash
git remote add origin リモートリポジトリのパス
git push origin master
```