PhpStorm&Dockerで最強のphp開発環境を作ろう！（前半）

# はじめに
う〇この次に幼稚園児に人気の最強という単語を使っている時点でなんともこっぱずかしいタイトルですが、PhpStormをこよなく愛する自分としてはどうしても書きたかった内容なので、恥を忍んで投稿します。

オールドタイプな自分でもPhpStormを乗りこなしていくことで、いっぱしのペチパーになれた気がしました。
最近のPHPの開発現場では必須の

* dockerなどの仮想化技術を使った開発環境
* PHPUnitなどを使ったユニットテスト
* Gitなどを使ったソース管理
* Redmineなどを使ったタスク管理
 
がPhpStormの力で簡単に使いこなせるようになりますよ～
今回はMacで一度試したものをWindows10で実施した内容になっていますので、WindowsユーザもMacユーザもお試しあれ。

# この記事を読んで身につくこと
* Dockerをちょっと操作できる
* PhpStormを使ってxdebugによるステップ実行ができる
   * もうなんでもかんでもprint_rしなくてもいーんだよ
* PhpStormを使ってPHPUnitでのテスト実行＆カバレッジ計測ができる
   * テストの実行やカバレッジ計測もPhpStormの力で効率的でわかりやすくなる！
   * テストコードもxdebugと連携してSTEP実行できちゃうぞ
* PhpStormを使ってdatabaseの操作ができる
   * なんだかんだ他のDBツールを使わなくなっちゃうYO!
* PhpStormを使ってGitでのソース管理＆Redmineでのタスク管理ができる
   * もうgitのややっこしいコマンド覚えなくても、なんとかなっちゃうYO!
   * Redmineのチケットとブランチを関連付けて複数タスクの並列対応も怖くない！
   
# 前提のスキル
一応下記のスキルがあるといいです。

* PHPでなんか作ったことがある
* ソフトのインストールや起動は一人でできる
* terminal（コマンドプロンプト 黒い画面）をちょっとは触ったことがある
* Gitってなにかなんとなく知ってる

# 必要なソフトをインストールしよう
今回下記のソフトを使いますので、面倒でもインストールしてください。

* [PhpStorm](https://www.jetbrains.com/phpstorm/download/) (現バージョン：2017.3)
    * 30日間トライアルできますが、その後手放せなくなり購入してしまうでしょう。
* [Docker](https://www.docker.com/) (現バージョン：17.09.1-ce-win42)
    * windowsの人はHyper-Vが使えないとインストールできないようです。
    * Storm＆Dockerへの愛があれば、私のようにwindow10 HomeをProにアップグレードしてしまうでしょう。
    * windowsの人はDockerの下記の設定にチェックが入っているか確認してください。
    * windowsの場合xdebugの設定で必要なdockerで使用するIPも確認しておきましょう。
  
<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/68254/03a89f1a-3f99-a5e5-6bf3-ff1727ccefc0.png">
<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/68254/8e579199-0f00-7de6-a9ec-343e4ba35efa.png">

* git [Widows版(git-for-windows)](https://git-for-windows.github.io/)、[Mac版](https://git-scm.com/downloads)
    * バージョン管理のソフトを初めて使う人にとってはとっつきにくいかもだけど、PhpStormさえあれば楽々使いこなせる！？


# Docker環境を整えよう
オールインワンなDocker環境を用意したので、terminal(Windowsの人はGitBashがいいです)を起動してPhpStormの作業ディレクトリに移動してgit cloneしましょう。
（頭に＄がついてるのがコマンドなので、＄を取り除いてコピペして実行してね！）

```bash:githubから最強を取ってくる
$ cd /c/Users/your_account/PhpstormProjects
$ git clone https://github.com/albyte/php7-all-in-one.git

※ your_accountのところは、書き換えてね！
```

Macの人は、下記のようにdocker-composeの該当の行をコメントアウトしてください。
Windowsの人は、Dockerの確認のところでSubnet addressが10.0.75.0以外だったなら変更してください。

```yaml:/c/Users/your_account/PhpstormProjects/php7-all-in-one/docker-compose.yml
...
  php-web:
...
    environment: [ xdebug_remote_host=10.0.75.1 ] # for windows
       ↓
#    environment: [ xdebug_remote_host=10.0.75.1 ] # for windows
```


cloneしたDockerを起動してみます。

```bash:Docker起動
$ cd /c/Users/your_account/PhpstormProjects/php7-all-in-one
$ docker-compose build
....いろいろ出力される
Successfully tagged php7allinone_php-cli:latest
mysql uses an image, skipping
$ docker-compose up -d
....いろいろ出力される
Creating php-cli ... done
```

windowsのかたで[こんなエラー](https://github.com/docker/compose/issues/5019)が出て起動しない場合は**Git Bash**を起動して、そこで上記を実行したら動くかもです。
下記のコマンドで、php-webとmysqlが起動（State=Up）してたらOKです。

```bash:dockerの状態確認
$ docker-compose ps
  Name               Command             State             Ports
-------------------------------------------------------------------------
mysql      docker-entrypoint.sh mysqld   Up       0.0.0.0:13306->3306/tcp
php-cli    php -v                        Exit 0
php-web    apache2-foreground            Up       0.0.0.0:10080->80/tcp
```
docker-composeのコマンドの詳細は、[こちら](https://qiita.com/search?q=docker-compose%20command)を参考にしてみてください。

下記コマンドを使い、composerでphpのパッケージを取得しておきます。(PHPUnitの実行で必要になります)

```bash:composer実行
$ docker-compose run php-cli composer install
```

# Docker上のwebページを表示してみよう
ブラウザで下記URLにアクセスして、こんな画面がでればOKです。
http://localhost:10080/test.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/23df1617-5557-c1ad-ec84-a969d19a1e08.png)


# Docker上のphpを実行してみよう
terminalで実行して、こんな結果でたらOKです。

```bash:php-cliのphp動作確認
$ docker-compose run php-cli php -v
PHP 7.0.9 (cli) (built: Jul 29 2016 20:54:37) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.9, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans
```

# PhpStormを起動しよう
インストールしたPhpStormを起動したらこんな画面がでるので、先ほどgit cloneしたphp7-all-in-oneフォルダを開いてやりましょう。
     <img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/68254/96bdd10a-73d9-bc13-005b-a2a1b8cad0be.png">

# PhpStormの設定を行おう
こんな画面がでてきますので、まずSettingsを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/56de4d31-c877-a0f0-7efc-046fca931c38.png)

## Dockerの設定
Dockerの設定がこんな感じになっているのを確認しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/6c4a6928-98c6-de1e-6b13-5c9fc7096ee8.png)
**※（追記）docker-composeがIDE上から起動しない場合は、Certificated folderを空にしてください！**

設定するとDockerをPhpStorm上で扱えるようになります。
コンテナのログを見たり、Execでbashを指定して、コンテナの中にログインするのに使うと便利です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/03fd488b-578f-2b5d-407b-d00c28e780db.png)


## Serversの設定
赤枠に注意して、Dockerのphp-webのポートである10080を設定して、プロジェクトルートが/var/wwwにマウントされていることを記載してやりましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/f41bd96d-1c2a-5c85-5e52-798b5e9b628b.png)

## PHP Interpreter & xdebug & PHPUnitの設定
ちょっと長いですが、ここがうまくいけば今後がとても楽ですので、我慢して設定してみてください。
[Languages & Framework] -> [PHP] を選択して、[PHP Language level]に[7]を選んでやりましょう。
CLI Interpreterの横の[...]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/9ec40cb4-cce5-708f-926f-c0ece1af3df0.png)
[CLI Interpreters]で[＋]をクリックし、[From Docker ....]を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/14dfa6c3-da5c-64bf-f58e-3f0cd3e8ccc8.png)
下の赤い枠を注意して、入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/31132f6d-c231-0820-6a96-1c046892712e.png)
Environment...の[...]をクリックすると入力ダイアログがでるので、こちらも下記のように設定します。（CLIでxdebugを使う時重要な設定です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/c1cbc9eb-5510-2a53-39ce-bd122a7f2b50.png)
すると、このようにPHP versionとXdebugバージョンが表示されるはずです。表示しない場合はリロードボタンをクリックしてみてください。
それからConfigration optionの[...]をクリックして設定してください。(これもCLIでxdebugを実行する時重要です)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/0a183e91-1682-080c-02a3-30bf48068a9e.png)
入力の時は、-dをつけないように！
Windowsユーザは、「Value」に「10.0.75.1」(Dockerの確認のところでSubnet addressが10.0.75.0だったなら)
Macユーザは、「Value」に「 ~~docker.for.mac.localhost~~ [docker.for.mac.host.internal](https://docs.docker.com/docker-for-mac/networking/#per-container-ip-addressing-is-not-possible) 」
と入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/855154e5-1ab8-e9a2-58d2-a2eec6c9c2dd.png)
最終的にphpの設定画面でこのようになるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/7228e192-2e72-b2d6-5371-bf70823c414d.png)
DBGp Proxyでは下記のように設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/f31b6444-866b-770b-5201-b23a7a9d8633.png)
Test Frameworksでは、[PHPUnit by Remote Interpreter]を追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/aaacb91a-ca70-1975-d276-3322e1ffd337.png)
以前に設定したphp-cliを選ぶと下記のようにPHPUnitのバージョン表示されるはずですので、[Default configration file]にチェックをつけて[/var/www/phpunit.xml]を入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/58eb8484-df77-b141-c5b2-028d2c8a47a1.png)

# PhpStormでPHPスクリプトを実行&デバッグしてみよう
設定がうまくいっているか確認します。
テスト用のスクリプトpublic/test.phpを下記のように実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/387bf430-9c71-0e9c-e306-81b91b356fb9.png)

すると、こんな感じで実行結果が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/69945d69-2a6f-05df-5af1-149bf8440c6d.png)

では、このソースにbreak pointを設定してデバッグしてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/a2758674-bd85-3a75-0079-452c480a672f.png)
このようにbreak pointで止めることができました。

# PhpStormでブラウザで実行したスクリプトをデバッグしてみよう
まずGoogleChromeに[Xdebug helper]を追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/e4445696-c006-89d0-8af8-632d816522bb.png)

PhpStorm側でデバッグ接続リスナーをONにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/a16a125a-16ba-7730-ac73-a3a91fef11db.png)

GoogleChromeでURLにアクセスして、Debugを有効にしてリロードしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/b60ead3f-809a-ec11-d025-4082a27fdcd0.png)
すると先ほどと同じようにbreak pointで止めることができます。
止まらない人は、ファイヤーウォールのせいかもしれないので、とりあえずOFFにしてブラウザをリロードしてみましょう。
logs/xdebug.logにログを出力しているので、ちゃんとホストOSの9000ポートにアクセスされているか確認してみてください。

# 次回の内容は？

* PhpStormでPHPUnitを実行してみよう
* PhpStormでDocker上のMySQLにアクセスしてみよう
* PhpStormでGit＆Redmineの連携をしてみよう
 
の3本です！

お楽しみに～