Homestead で Laravel 5.1 (LTS) の環境を構築する

参考にした。
https://laravel.com/docs/5.1/homestead

# 事前に用意するもの
- Vagrant
- Virtualbox
- Composer

環境は MacOSX 10.11.4

# box をインストール

下記のコマンドで vagrant box をインストールする。

```
vagrant box add laravel/homestead
```

失敗する場合は下記を実行するといいらしい。

```
vagrant box add laravel/homestead https://atlas.hashicorp.com/laravel/boxes/homestead
```

もし昔に使ったことがあって、バージョンが古ければ下記で box のアップデートができる。
Homestead の VM を起動するたびに box が最新かどうかを表示してくれる。現時点では 0.4.4。

```
homestead update
```

ちなみに古い Homestead だと下記のコマンド。

```
homestead box update
```

# Homestead のコードをインストール

composer 経由でインストールする。

```
composer global require "laravel/homestead=~2.0"
```

上記で homestead コマンドがインストールされるが、 `which homestead` などでパスが通ってないようであれば、下記を `.bashrc` などに書いてパスを通す。

```
export PATH=~/.composer/vendor/bin:$PATH
```

homestead をインストールしたら、初期スクリプトを実行する。

```
homestead init
```

これを実行すると、 `~/.homestead` ディレクトリが生成される。
そのディレクトリ以下に、Homestead.yaml という Homestead の設定ファイルがあり、それを編集することで環境の追加などができる。

# 環境の設定

Homestead の設定は `~/.homestead/Homestead.yaml` を編集することで行う。
編集は vim などのエディタを使ってもいいし、`homestead edit` というデフォルトのエディタを呼び出すコマンドも用意されている。

```
vim ~/.homestead/Homestead.yaml
or
homestead edit
```

そこで、新しく作るプロジェクトのディレクトリのマッピングを行う。例えば hoge というプロジェクトを Laravel で作成する場合は、下記のように Homestead.yaml に追記する。

```
folders:
(中略)
    - map: ~/works/hoge
      to: /home/vagrant/works/hoge

sites:
(中略)
    - map: hoge.local
      to: /home/vagrant/works/hoge/public
      hhvm: true

databases:
(中略)
    - hoge
```

構成としては、自分のワークディレクトリの hoge を、VM 内の vagrant ユーザーのホームディレクトリと共有させるようにしている。
そして、その public フォルダに WEB サーバーのルートディレクトリを指定する。hhvm はお好みで。
ドメインを `hoge.local` としたので、それを hosts に追記する。あと、DB に hoge を追加する。

```lang:/etc/hosts
192.168.10.10 hoge.local
```

設定をしたら、プロビジョニングをして VM に反映する。VM が起動していなかったら、`homestead up` で起動させる。
また、ホスト側にワークディレクトリがある必要もある。` mkdir -p ~/works/hoge `

```
# homestead up で VM 起動しておく
homestead provision
```

ちなみに、`homestead xxx` の `xxx` が vagrant コマンドに存在する場合はそれを呼び出すようだ。
なので、Homestead の起動 / 終了 / ログイン なんかはそれぞれ下記のようなコマンドを実行すればよい。

```
homestead up        # 起動
homestead halt      # 終了
homestead ssh       # ssh ログイン
homestead provision # プロビジョニング
homestead           # ヘルプを表示
```

もう一歩進んだ tips としては、Homestead に ssh ログインしなくても、run コマンドで処理ができる。
具体的に言うと、composer の update とか、マイグレーションを下記のように実行可能。

```
homestead run "cd /path/to/project && composer update"
homestead run "cd /path/to/project && php artisan migrate"
```

# Laravel をインストールする

Laravel も composer 経由でインストールするが、環境ごとの差異がでると困るので、VM の中でプロジェクトは生成する。下記コマンドで VM に SSH ログインできる。

```
homestead ssh
```

上記で作ったディレクトリに移動して、プロジェクト生成コマンドを実行する。
LTS (Long Term Support) である必要がない場合は、5.1 は指定しなくてOK。

```
cd works/hoge
composer create-project laravel/laravel . 5.1 --prefer-dist
```

composer の実行が終わったら、`.env` ファイルが生成されているので、ここで扱う Laravel の環境を記述しておく。今回は DB を hoge にしたので、そこだけ変更する。

```lang:diff
APP_ENV=local
APP_DEBUG=true
APP_KEY=SomeRandomString

DB_HOST=localhost

- DB_DATABASE=homestead     # <- ここを修正！！
+ DB_DATABASE=hoge

DB_USERNAME=homestead
DB_PASSWORD=secret

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
```

# 接続確認

DB 接続の確認をする場合は、デフォルトで users を作成するマイグレーションが入っているので、それをためしに実行するとよいだろう。気に入らなければロールバックを行えば良い。

```
php artisan migrate
php artisan migrate:rollback
```

サイト確認はホスト環境のブラウザから下記にアクセスする。自分で別のホスト名をつけた場合はそれでアクセスする。
http://hoge.local


# おまけ

Laravel5 からは、Html / Form ファサードが同梱されなくなったので、必要であれば下記で追加しておく。
下記を参考にした。
https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/

VM にログインして、プロジェクトルートで下記のコマンドを実行する。

```
composer require laravelcollective/html
```

config/app.php を編集して、ファサードが使えるようにする。

```
<?php
// config/app.php
 
return [
    // サービス・プロバイダーの登録
    'providers' => [
 
        // ...
 
        Collective\Html\HtmlServiceProvider::class,  // 追加
    ],
 
    // ファサードの登録
    'aliases' => [
 
        // ...
 
        'Form' => Collective\Html\FormFacade::class,  // 追加
        'Html' => Collective\Html\HtmlFacade::class,  // 追加
    ],
];
```

以上。