ぼくのかんがえたさいきょうのEC-CUBE3開発環境

[EC-CUBE Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ec-cube) の3日目です。

## ぼくのかんがえたさいきょうのEC-CUBE3開発環境とは
Macで開発するために考えた開発環境です。だいたい以下のような感じです。

1. Dockerを使ってできるだけ環境を汚さない
1. 動作確認するためのEC-CUBEはコンテナ上で動かす
1. コードを書いたりPHPUnitのテストを実行するのはMac上のIntelliJからできるようにする
1. IntelliJでブレークポイントを設定してコンテナで動いているEC-CUBEのデバッグを出来るようにする

Dockerを使った開発環境を紹介している記事がいくつかありましたが、3と4を出来るものが見当たらなかったので出来たものが、「ぼくのかんがえたさいきょうのEC-CUBE3開発環境」です。

## 必要なもの
- [IntelliJ IDEA](https://www.jetbrains.com/idea/)
    - PhpStormでもいいと思いますが、個人でライセンスを持ってるので使ってます。
- [PHPBrew](https://github.com/phpbrew/phpbrew/blob/master/README.ja.md)
    - IntelliJに設定します。EC-CUBE3は[今のところPHP5.3.9〜7.0.xまで対応している](http://ec-cube.github.io/requirement.html)のでバージョンを変えれるようにPHPBrewを使っています。
- [Docker for Mac](https://docs.docker.com/engine/installation/mac/#/docker-for-mac)
    - WebサーバやDBなども複数種類、複数バージョンサポートしているので環境を切り替えやすいようDockerを使います。
- [docker-sync](http://docker-sync.io/)
    - Docker for Macのファイル共有が遅いのでdocker-syncを使います。
    - [ここ](https://github.com/EugenMayer/docker-sync/wiki/1.-Installation)を参考にfswatch/unison/rsyncもインストールしておきます。

## 環境構築

[GitHubのリポジトリ](https://github.com/kiy0taka/eccube3-dev)にdocker-compose.ymlとか置いてるので、クローンしてコンテナをビルドします。EC-CUBE3本体はサブモジュールにしています。

    $ git clone git@github.com:kiy0taka/eccube3-dev.git
    $ cd eccube3-dev
    $ git submodule init && git submodule update
    $ docker-compose build

コンテナを起動します。docker-syncを使っているのはDocker for Macのファイル共有が遅いためです。

    $ docker-sync-stack start

`eccube_install.php`をコンテナ内で実行してEC-CUBEのインストール処理を実行します。

    $ docker-compose exec app bash -c "chown -R www-data: . && php eccube_install.php pgsql"


## 動作確認
`http://localhost:8080/ec-cube/html`にアクセスしてEC-CUBE3が見えたらOKです。メール送信する機能を使って送信されたメールは`http://localhost:1080/`で確認できます。

再起動したときにマウントしているディレクトリのパーミッションがおかしくなってエラーになる場合もあるので、そのときは以下のコマンドを実行します。

    $ docker-compose exec app chown -R www-data: app/cache

## プログラミングとテスト
IntelliJを使って普通にできますが、DBを使うテストはコンテナのデータベースを見に行けるように以下の内容を`/private/etc/hosts`に追記しておきます。

    127.0.0.1	localhost db mail

また`/var/www/html/ec-cube`がないとテストでエラーになるのでシンボリックリンクを作っておきます。

    $ sudo mkdir -p /var/www/html && sudo ln -s ${PWD}/ec-cube /var/www/html/ec-cube

以下のコマンドでテストが成功していたら大丈夫です。

    $ cd ec-cube
    $ vendor/phpunit/phpunit/phpunit tests/Eccube/Tests/Service/ShoppingServiceTest.php

## デバッグ
コンテナ上で動いているPHPプログラムをMac側でデバッグするのは少し面倒です。最終的に[これ](https://gist.github.com/chadrien/c90927ec2d160ffea9c4)の下の方にたどり着きました。

以下のコマンドを実行して、IPエイリアスを割り当てればデバッグできるようになります。

    $ sudo ifconfig lo0 alias 10.254.254.254

IntelliJ側の設定だいたい以下のとおりです。
![スクリーンショット 2016-12-03 22.50.34.gif](https://qiita-image-store.s3.amazonaws.com/0/31709/664e9bc0-7e6a-0397-00f0-cc86eadff36b.gif)

![スクリーンショット 2016-12-03 22.52.27.gif](https://qiita-image-store.s3.amazonaws.com/0/31709/7a046b2c-e14e-a61c-5fb7-71bea6ff7882.gif)

![スクリーンショット 2016-12-03 22.53.03.gif](https://qiita-image-store.s3.amazonaws.com/0/31709/3418af15-b173-6d39-0f0c-20b4299042cc.gif)

これでIntelliJ側でブレークポイントを設定しておくと、ステップ実行したり変数の中身を確認できるようになります。

![スクリーンショット 2016-12-03 22.59.14.gif](https://qiita-image-store.s3.amazonaws.com/0/31709/ceb30778-f686-2379-588b-73c58369b1c0.gif)


## 最後に
こんな感じでEC-CUBE3の開発を2ヶ月ほどやっていて、まあまあいい感じに開発できていると思います。デバッグの設定等は一度やってしまえばいいのですが、docker-syncはちょっと面倒な感じもあります。今後Docker for Macがよくなってdocker-syncを使わなくてもいいようになることをサンタさんにお願いしましょう。