PhpStormからphp-cs-fixerを使ってソースのコーディングスタイルをPSR-2に変換する

PhpStormでは自動整形の機能で選択できるコーディングスタイルとして PSR-2 に対応しており、通常はこれに頼っていれば問題ありません。

でも、たとえば過去のプロジェクトのリファクタリング等でコーディングスタイルを一括して変更したい時は、PHP製コマンドラインツール php-cs-fixer を利用するのが便利です。

* [PHP Coding Standards Fixer](http://cs.sensiolabs.org)
* [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)

php-cs-fixer 自体の説明は省略しますが、非常に多くのオプション設定があり、PSR-2っぽいけどちょっと違うみたいなコーディングルールにも対応できる優れたツールです。何それっていう人は以下の記事を参照。

* [PHP CS Fixer v2 でもっと快適PHPライフ - Flog Splash](http://fivestar.hatenablog.com/entry/2017/03/30/233744)

この便利な php-cs-fixer を PhpStorm から簡単に利用できるようにします。

なお試した環境は Windows10 / PHP 5.6 / PhpStorm 2016.2 です。


## php-cs-fixer を Composer globalインストールする

ComposerのGlobal環境が設定されていること前提です。

	$ composer global require friendsofphp/php-cs-fixer

これで php-cs-fixer コマンドが利用できるようになります。

なお2017年2月現在、php-cs-fixerのバージョンは 2.0.1 がインストールされます。バージョン1系とは一部オプションが異なっていますのでご注意ください。以下の記事が参考になります。

* [php-cs-fixer-2.0.0をためす - Qiita](http://qiita.com/msmsny/items/649f18c7f6218aa590e1)


Windowsの場合は ``%USERPROFILE%\AppData\Roaming\Composer\vendor\bin\php-cs-fixer.bat`` に実行ファイルが配置されます。

（以下、パスの %USERPROFILE% は適当に読み替えてください。）

## External Tool として php-cs-fixer を登録し、任意のタイミングで整形する

まずは Exrernal Tool （外部ツール）として登録する方法です。

1. [Ctrl] + [Alt] + [S] で設定ウィンドウを開く
2. Tools → External Tools
3. 開いたウィンドウから [+] をクリックして Name: に適当な名前を入力 （たとえば ``PHP CS Fixer (PSR-2)``）
4. Program: に php-cs-fixer のコマンドパスを入力 (``%USERPROFILE%\AppData\Roaming\Composer\vendor\bin\php-cs-fixer.bat``)
5. Parameters: にコマンドオプションおよび対象パスの変数を入力 ``--rules=@PSR2 --verbose fix "$FilePath$"`` （php-cs-fixer v2.0以降の場合）
6. Working directory: に対象パスの変数を入力 ``$ProjectFileDir$``

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3940/ef412d35-57d1-7480-e57a-64bf0391704c.png)


Web上で検索して出てくる説明では対象パスを ``"$FileDir$/$FileName$"`` としているものが多いですが、その指定だとディレクトリを対象として実行した場合に ``/path/to/directoryName/directoryName`` のように置換されてしまうので、ここでは ``"$FilePath$"`` としました。

* 参考 [@fabpot php-cs-fixer config for PhpStorm](https://gist.github.com/mpalourdio/46f792347cf9d46b121c)

単体のファイルを対象とする場合、エディタから Tools → Exrernal Tools → 登録した名前（たとえば ``PHP CS Fixer (PSR-2)``） で実行できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/3940/e95dbb8d-509f-449a-0c47-b8cc90c7ecba.png" width="50%">

ディレクトリを対象とする場合、プロジェクトツリーから右クリック → Exrernal Tools → 登録した名前（たとえば ``PHP CS Fixer (PSR-2)``） で実行できます。

php-cs-fixer には .php_cs 設定ファイルという仕組みがあって、デフォルトの設定をPHPコードで定義できます。
プロジェクト毎に複数人がソースを触るようなケースでは、PhpStormの自動整形機能を使うよりも、プロジェクト単位で .php_cs 設定ファイルを共有するのが有効かもしれません。

ショートカットキーに登録するには、設定ウィンドウから Keymap をクリックして External Tools → グループ名 → 登録した名前（たとえば ``PHP CS Fixer (PSR-2)``）をダブルクリックして Add Keybord Shortcut を選択、キーボードから適当なショートカットキーを入力してOKボタン。自分は [Ctrl] + [Alt] + [右大カッコ] を設定しています。
（初期設定ではプロジェクトウィンドウの移動に割り当てられていましたが、複数同時に開くことはないので削除）


## File Watcher として php-cs-fixer を登録し、ファイルの更新時に強制整形する

前述のコマンドを File Watcher として登録しておくと、ファイルの更新を検知して自動実行してくれます。

1. [Ctrl] + [Alt] + [S] で設定ウィンドウを開く
2. Tools → File Watchers
3. 開いたウィンドウから [+] をクリックして Name: に適当な名前を入力 （たとえば ``PHP CS Fixer (PSR-2)``）
4. Immediate file synchronization のチェックを外す
5. File type: PHP を選択
6. Scope: Current File を選択
7. Program: に php-cs-fixer のインストールパスを入力 (``%USERPROFILE%\AppData\Roaming\Composer\vendor\bin\php-cs-fixer.bat``)
8. Arguments: に コマンドオプションおよび対象パスの変数を入力 ``--rules=@PSR2 --verbose fix "$FilePath$"`` （php-cs-fixer v2.0以降の場合）
9. Working directory: に対象パスの変数を入力 ``$ProjectFileDir$``

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3940/a615af6e-bff7-43fa-c512-95813145497d.png)


これで、たとえば ``function foo()`` のように関数定義を追加して保存した場合、上記コマンドが自動的に実行された結果、 ``public function foo()`` といった風に強制で書き換えられます。

ファイルの同期設定で頻繁に自動保存がかかるよう設定している場合、その都度 php-cs-fixer が実行されることになりますので、ご注意ください。
（File WatcherのON/OFFを簡単に切り替える方法があれば良いかなと思うんですが…。）

自動保存の設定変更については、以下の記事が参考になります。

* [PHPStormのファイルの自動保存機能をオフにして動作を軽くする - Qiita](http://qiita.com/J_Sugar__/items/1bdc8240c4ff099d96ff)

なお、Web検索した限りではGitのpre-commitフックでphp-cs-fixerを使っている方が多いようですね。Qiitaにも以下の記事がありました。

* [PHPの低品質なコードをコミット前に自動的に検査する - Qiita](http://qiita.com/kadoyau/items/eb4e7bc86588e6f33d16)