Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第2回

# **はじめに**
Laravel 公式で提供されている Homestead と Vagrant box を利用し, 1 つの仮想マシン上に 3 つの Laravel の開発環境 ( PHP5.6 + PHP7.0 + PHP7.1 ) を構築する手順をまとめています。

今回は, Homestead6 から追加された [ PHPバージョンの切替機能 ] を利用して環境を構築していきます。
引用 : [Laravel 5.5 Laravel Homestead](https://readouble.com/laravel/5.5/ja/homestead.html "Laravel 5.5 Laravel Homestead")
> **複数のPHPバージョン**
Homestead6から、同一仮想マシン上での複数PHPバージョンをサポートを開始しました。Homestead.yamlファイルで、特定のサイトでどのバージョンのPHPを使用するのかを指定できます。利用できるPHPバージョンは、"5.6"、"7.0"、"7.1"、"7.2"です。この機能は、Nginx使用時のみ利用できます。

* [第1回 -前編-](https://qiita.com/slangsoft/items/21e5cc5015ff71e2f741 "第1回 -前編-")
 * [第01章 事前準備](https://qiita.com/slangsoft/items/21e5cc5015ff71e2f741#%E7%AC%AC01%E7%AB%A0-%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99 "第01章 事前準備")
 * [第02章 Laravel 開発環境の構築](https://qiita.com/slangsoft/items/21e5cc5015ff71e2f741#%E7%AC%AC02%E7%AB%A0-laravel-%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89 "第02章 Laravel 開発環境の構築")
* [第1回 -後編-](https://qiita.com/slangsoft/items/380fccbac323fd034530 "Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第1回 -後編-")
 * [第03章 複数の Laravel プロジェクトに対応 ( サブドメイン利用 )](https://qiita.com/slangsoft/items/380fccbac323fd034530#%E7%AC%AC03%E7%AB%A0-%E8%A4%87%E6%95%B0%E3%81%AE-laravel-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E5%AF%BE%E5%BF%9C--%E3%82%B5%E3%83%96%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%88%A9%E7%94%A8- "第03章 複数の Laravel プロジェクトに対応 ( サブドメイン利用 )")
 * [参考サイト紹介](https://qiita.com/slangsoft/items/380fccbac323fd034530#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88%E7%B4%B9%E4%BB%8B "参考サイト紹介")
* 第2回
 * [Laravel 開発環境の構築 ( PHP5.6 + PHP7.0 + PHP7.1 )](https://qiita.com/slangsoft/items/18ec6d9067d642c5cb74#laravel-%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89--php56--php70--php71- "Laravel 開発環境の構築 ( PHP5.6 + PHP7.0 + PHP7.1 )")
* [第3回](https://qiita.com/slangsoft/items/59369286d32d7d2760f6 "Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第3回")
 * [Eclipse で Laravel の入力補完が効くようにする ( laravel-ide-helper )](https://qiita.com/slangsoft/items/59369286d32d7d2760f6#eclipse-%E3%81%A7-laravel-%E3%81%AE%E5%85%A5%E5%8A%9B%E8%A3%9C%E5%AE%8C%E3%81%8C%E5%8A%B9%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B "Eclipse で Laravel の入力補完が効くようにする ( laravel-ide-helper )")

# **前提条件**
なお, この記事は [ Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第1回 ] の [前編](https://qiita.com/slangsoft/items/21e5cc5015ff71e2f741 "Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第1回 -前編-") と [後編](https://qiita.com/slangsoft/items/380fccbac323fd034530 "Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第1回 -後編-") が前提条件となっています。これらの記事をご覧になっていない方は, 事前にご確認ください。

# **Laravel 開発環境の構築 ( PHP5.6 + PHP7.0 + PHP7.1 )**

ここでは, サブドメインを使用して PHP バージョンの異なる複数プロジェクトに対応する方法を紹介します。

まずは仮想マシンを起動しましょう。ターミナル ( Git Bash ) で Vagrantfile があるディレクトリ ( 今回の場合は [ Homestead ] ) に移動してから下記のコマンドを実行します。

```txt:ターミナル
slangsoft@win7 MINGW64 ~
$ cd ~/LaravelProjects/Homestead/  <-- 入力 : Vagrantfile があるディレクトリに移動

slangsoft@win7 MINGW64 ~/LaravelProjects/Homestead (master)
$ vagrant up  <-- 入力 : 仮想マシンの起動
```

次に, 仮想マシンに SSH でログインし, Composer を利用して Laravel ファイルをダウンロードしていくのですが, ここで注意が必要です。Laravel はバージョンによってシステム要件が異なります。

### Laravel のシステム要件

|Laravel|PHP|Mcrypt|OpenSSL|PDO|Mbstring|Tokenizer|XML|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|5.0|>= 5.4.0|PHP拡張|PHP拡張|PHP拡張|PHP拡張|-|-|
|5.1|>= 5.5.9|-|PHP拡張|PHP拡張|PHP拡張|PHP拡張|-|
|5.2|>= 5.5.9|-|PHP拡張|PHP拡張|PHP拡張|PHP拡張|-|
|5.3|>= 5.6.4|-|PHP拡張|PHP拡張|PHP拡張|PHP拡張|PHP拡張|
|5.4|>= 5.6.4|-|PHP拡張|PHP拡張|PHP拡張|PHP拡張|PHP拡張|
|5.5|>= 7.0.0|-|PHP拡張|PHP拡張|PHP拡張|PHP拡張|PHP拡張|

[前回の記事](https://qiita.com/slangsoft/items/21e5cc5015ff71e2f741 "Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第1回") で [ TestProject ] と [ TestProject2 ] は作成済みなので, 今回は PHP5.6.32 を使いたいという想定で, Laravel5.2 を使って [ TestProject3 ] を追加します。

### 構築するプロジェクトの構成

|プロジェクト名|Laravel Ver|PHP|アクセス用URI|
|:---|:--:|:--:|:---|
|TestProject|5.5|7.1|http://homestead.test/|
|TestProject2|5.5|7.0|http://myapp.homestead.test/|
|TestProject3|5.2|5.6|http://php65.homestead.test/|

それでは早速, [ TestProject3 ] ディレクトリに Laravel5.2 をダウンロードします。
既に仮想マシンは立ち上げましたので, 仮想マシンに SSH でログインし, 以下のコマンドを実行します。

```txt:RLogin
vagrant@homestead:~$ cd ./code  <-- 入力 : [ code ] ディレクトリに移動
vagrant@homestead:~/code$ composer create-project laravel/laravel --prefer-dist TestProject3 5.2  <-- 入力 : [ TestProject3 ] ディレクトリに Laravel5.2 をダウンロード
```

**上記コマンドの実行でエラーが出た場合**
2017年12月02日現在, 上記コマンドの実行で, 必ず下記のようなエラーが発生します。

```txt:エラー内容
Script php artisan clear-compiled handling the pre-update-cmd event returned with error code 255
```

原因は公式のバグなので, 以下のように対処してください。

まず, Windows7 のエクスプローラーを使用して下記ディレクトリを開き, [ TestProject3 ] ディレクトリが作成されていることを確認してください。

```txt:ディレクトリ
C:\Users\ユーザー名\LaravelProjects\TestProject3
```

このディレクトリ配下にある [ composer.json ] をテキストエディタで開き, 以下の修正を行います。

**修正方法**

```json:composer.jsonより抜粋
    "scripts": {
        "post-root-package-install": [
            "php -r \"copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "pre-update-cmd": [                <-- 削除
            "php artisan clear-compiled"   <-- 削除
        ],                                 <-- 削除
        "post-update-cmd": [
            "php artisan clear-compiled",  <-- 追加
            "php artisan optimize"
        ]
    },
```

**修正完了後**

```json:composer.jsonより抜粋
    "scripts": {
        "post-root-package-install": [
            "php -r \"copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ]
    },
```

修正が完了したら, 仮想マシン上で [ TestProject3 ] ディレクトリへ移動し, 以下のコマンドを実行します。

```txt:RLogin
vagrant@homestead:~/code$ cd ./TestProject3              <-- 入力 : [ TestProject3 ] ディレクトリへ移動
vagrant@homestead:~/code/TestProject3$ composer install  <-- 入力
```

これで無事に Laravel5.2 のインストール ( [ TestProject3 ] プロジェクトの作成 ) は完了です。

次に, [ Homestead.yaml ] の [ sites: ] に設定を追加します。

```txt:修正するファイル
C:\Users\ユーザー名\LaravelProjects\Homestead.yaml
```

```yaml:Homestead.yamlから抜粋
sites:
    - map: homestead.test
      to: /home/vagrant/code/TestProject/public
      php: "7.1"                                  <-- この行を追加
    - map: myapp.homestead.test
      to: /home/vagrant/code/TestProject2/public
      php: "7.0"                                  <-- この行を追加
    - map: php56.homestead.test                   <-- この行を追加
      to: /home/vagrant/code/TestProject3/public  <-- この行を追加
      php: "5.6"                                  <-- この行を追加
```

設定を追加したら, その設定内容を再読み込みさせる必要があります。ターミナル ( Git Bash ) で Vagrantfile があるディレクトリ ( 今回の場合は [ Homestead ] ) に移動してから下記のコマンドを実行します。

```txt:ターミナル
slangsoft@win7 MINGW64 ~
$ cd ~/LaravelProjects/Homestead/  <-- 入力 : Vagrantfile があるディレクトリに移動

slangsoft@win7 MINGW64 ~/LaravelProjects/Homestead (master)
$ vagrant provision  <-- 入力 : 設定ファイルの再読み込み
```

続けて, hosts ファイルに追加したサイトの設定を追加します。

メモ帳を管理者権限で起動します。
[ ファイル(F) ] → [ 開く(O)... ] を実行し, [ ファイル名(N): ] 欄に下記のファイル名を入力して [ 開く(O) ] ボタンをクリックします。

```txt:hostsファイル名
C:\Windows\System32\drivers\etc\hosts
```

hosts ファイルの最終行に下記を追記し, 上書き保存してメモ帳を閉じます。

```txt:hostsファイルに追加する設定
192.168.10.10 homestead.test
192.168.10.10 myapp.homestead.test
192.168.10.10 php56.homestead.test  <-- この行を追加
```

今度はブラウザから [ http://php56.homestead.test ] にアクセスしてみてください。下図のように表示されれは成功です。
![LaravelWebPage_01.png](https://qiita-image-store.s3.amazonaws.com/0/65765/115c04cf-634a-facb-dbe9-8f0b8f3ccc43.png)

ただ, これでは意図したとおりに PHP5.6 で動作しているかが判断できませんので, アクセスした時に PHP のバージョンを表示するように内容を変更してみましょう。

Windows7 のエクスプローラーを使用して下記ディレクトリを開き, その中にあるwelcome.blade.php をテキストエディタで開きます。

```txt:ディレクトリ
C:\Users\[ユーザー名]\LaravelProjects\TestProject3\resources\views
```

PHP のバージョンを表示させるために, 以下のように修正します。

**[ TestProject3 ] の修正方法**

```html+php:welcome.blade.phpより抜粋
<body>
    <div class="container">
        <div class="content">
            <div class="title">Laravel 5</div>
            <div><?php echo 'Current PHP version: ' . phpversion(); ?></div>  <-- この行を追加
        </div>
    </div>
</body>
```

同様の修正を, [ TestProject ] と [ TestProject2 ] にも行ってください。

**[ TestProject ] と [ TestProject2 ] の修正方法**

```html+php:welcome.blade.phpより抜粋
<body>
    <div class="flex-center position-ref full-height">
        @if (Route::has('login'))
            <div class="top-right links">
                @auth
                    <a href="{{ url('/home') }}">Home</a>
                @else
                    <a href="{{ route('login') }}">Login</a>
                    <a href="{{ route('register') }}">Register</a>
                @endauth
            </div>
        @endif

        <div class="content">
            <div class="title m-b-md">
                Laravel
            </div>
            <div><?php echo 'Current PHP version: ' . phpversion(); ?></div>  <-- この行を追加

            <div class="links">
                <a href="https://laravel.com/docs">Documentation</a>
                <a href="https://laracasts.com">Laracasts</a>
                <a href="https://laravel-news.com">News</a>
                <a href="https://forge.laravel.com">Forge</a>
                <a href="https://github.com/laravel/laravel">GitHub</a>
            </div>
        </div>
    </div>
</body>
```

ここまでできたら, それぞれのページを表示してみます。

http://homestead.test/
![LaravelWebPage_02.png](https://qiita-image-store.s3.amazonaws.com/0/65765/504d86fd-3dc5-5b41-7a87-97ece9813c49.png)

http://myapp.homestead.test/
![LaravelWebPage_03.png](https://qiita-image-store.s3.amazonaws.com/0/65765/c6303c55-1da1-5d12-52b9-848f4ccd87d5.png)

http://php56.homestead.test/
![LaravelWebPage_04.png](https://qiita-image-store.s3.amazonaws.com/0/65765/44da64d3-c767-05fc-4524-1a1384b86acd.png)

期待通り, PHP7.1 / PHP7.0 / PHP5.6 が切り替わっていることが確認でしました。