PHPStormをつかってLaravel5のHomesteadで開発を行うための準備

PHPフレームワーク[Laravel](http://laravel.com/)を簡単に試せるようなHomesteadというVagrant上で動かす環境が公式に配布されています。
Homesteadを使ってLaravelで開発を行う際に、PHPStormというIDE使いたいときに設定すべき項目をまとめました。

# PHPStormからリモートのファイルを修正する方法
リモートとは、ここではVagrantで動いているHomestead環境のこと。
## 手順
1. New projectでプロジェクトを作成する際に表示されるダイアログに従う。リモートで開発する？とかきかれるので状況に沿った回答を行うことでよしなに設定できる。
2. リモートで開発を選択すると、PHPStormにサーバを設定するためのパネルが表示される。

## 設定の詳細
- SFTP
- host 127.0.0.1
- port 2222

上記のような感じで設定する。host等の設定は`vagrant ssh-config`で確認できる。

# ローカルの修正をリモートに自動的に反映する
## 共有フォルダを使う方法（おすすめ）
in _src/stubs/Homestead.yaml_

```
folders:
   - map: ~/dev/Projectname //ローカルのディレクトリ
     to: /home/vagrant/projectName // vagrant上のディレクトリ

sites:
    - map: homestead.app // ローカルでここにアクセスすると 
      to: /home/vagrant/projectName/public // リモートではここのindex.phpが読み込まれるっぽい
```


## 共有フォルダを使わない方法
`Tool > Deployment > Automatic upload`にチェックを入れる。こうするとローカルでファイルを保存すると自動的にサーバーにアップロードするようになる。

### リモートの最新版を勝手に上書きしないようにする
`Deployment > Options`の`Warn when uploading over newer file`を適当に変更（内容比較 or 更新時間比較が選択可能）。
`Notify about remote changes`にチェックを入れる
参考：[【PHPStotm】FTPのアップロード・同期化の設定 | お仕事募集中](http://www.mikame.net/pr/archives/162)


# 補完を有効にする
PHPStormは素のままだとLaravel独自のメソッドなどを補完できなくてしんどいのでできるようにする。
## Facadeのメソッドの補完を有効にする
### できるようになること
[ytake.blog | PhpStormでLaravel5快適開発　おさらい](http://blog.comnect.jp.net/blog/119)を参考のこと。
### 手順
[barryvdh/laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper)の通りにComposerを使って導入する。Composerはライブラリの依存性を解決してくれるツールである（詳しくは[PHPの依存関係管理ツール Composer | ララ帳](https://laravel10.wordpress.com/2015/02/14/php%e3%81%ae%e4%be%9d%e5%ad%98%e9%96%a2%e4%bf%82%e7%ae%a1%e7%90%86%e3%83%84%e3%83%bc%e3%83%ab-composer/#more-95)を参考のこと。）
[書かれている手順](https://github.com/barryvdh/laravel-ide-helper#automatic-phpdoc-generation-for-laravel-facades)どおりにコマンドを叩き、設定ファイルへの記述を行う。プロジェクト内の設定ファイルはIDEが自動的に読み込むので特別な設定は不要。

## IoCコンテナからのオブジェクトの種類を推定してメソッドを補完する
### 事前知識：IoCコンテナとは
DIコンテナのこと。簡単にDIできる。DIについて初耳の人は[PHPでDI（Dependency Injection）](http://qiita.com/lga0503/items/4fcf6dc52d993df5dbb2)などを参照のこと。
IoCコンテナの具体例は[Laravel IoC コンテナの使い方 - Shin x blog](http://www.1x1.jp/blog/2014/02/how-to-use-ioc-container-in-laravel.html)を参考のこと。

### できるようになること
> It's possible to generate a PhpStorm meta file, to add support for factory design pattern. For Laravel, this means we can make PhpStorm understand what kind of object we are resolving from the IoC Container. For example, events will return an Illuminate\Events\Dispatcher object, so with the meta file you can call app('events') and it will autocomplete the Dispatcher methods.

引用元：[New: PhpStorm Meta for Container instances](https://github.com/barryvdh/laravel-ide-helper#new-phpstorm-meta-for-container-instances)

PHPStormのメタファイルを作成することで解決する。メタファイルを作成すると、ファクトリーデザインパターンをPHPStorm側でサポートできる。LaravelでIoCコンテナからのオブジェクトの種類をPHPStormが理解することができるようになる。例えば`events`は`Illuminate\Events\Dispatcher`オブジェクトを返すのだが、メタファイルがあれば`app('events')`を呼び、`Dispatcher`オブジェクトのメソッドを補完することができる。

### 手順
```
php artisan ide-helper:meta
```
プロジェクト内に`.phpstorm.meta.php`が生成され、自動的にPHPStormがロードする模様。




# コード整形を自動化する
## `Reformat Code`をPSR-2準拠にする
PHPのコーディング規約にPSRというものがあるのでそれに自動的に従うようにする。

![スクリーンショット 2015-07-24 11.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/39954/0d28378a-faa1-4980-8abc-20773fb52d12.png "スクリーンショット 2015-07-24 11.52.51.png")

設定> `Code Style`>`Set from`でPSR1/PSR2を選択。これで`Reformat Code`をした時の挙動を変えることができる。

## Saveした時に自動的にPSR-2準拠にする
`Cmd+s`を押した時にフォーマットと保存を行うような設定をします。

1. デフォルトの保存のキーボードショートカットを適当に置き換える
  - Settings > Keymapを選択する。
  - `Save All`のショートカットを適当なものに置き換える。私は`Alt+Cmd+s`にしました。

2. コードフォーマットと保存を行うマクロを生成する
  - Edit > Macros > Start Macro recording を選択する。
  - `Cmd+Alt+l`（`Reformat Code`のショートカット）→`Alt+Cmd+s`（手順1で決めた`Save All`のショートカット）の順番に押す。
  - 赤いStopボタンを押し、レコードを中断する。
  - ダイアログが表示されるので、マクロに名前をつける（Reformat and Saveにしました）。

3. `Cmd+S`にマクロを割り当てる
  - Settings > Keymapを選択する。
  - Reformat and Saveを探し、`Cmd+s`を割り当てる

これで保存したとき勝手にリフォーマットがかかります✌('ω')✌
なお、デフォルトでは当該ファイル全体にリフォーマットがかかりますが、`Shift+Alt+Cmd+l`でもう少し細かく指定ができるみたいです。

## 参考
- [PHP コードの整形はプログラマがやるべきことじゃない - Shin x blog](http://www.1x1.jp/blog/2014/09/code-format-is-not-human-task.html)
- [PHPのコーディング規約 PSR-0、PSR-1、PSR-2、PSR-3とは | 9ensanのLifeHack](http://9ensan.com/blog/programming/php/php-psr-coding-standards/)
- [phpStorm code reformatting on save - Stack Overflow](http://stackoverflow.com/questions/12496669/phpstorm-code-reformatting-on-save)