PHPStormでPHP CS Fixerを設定する方法。（WSL2上のファイルにも適用する方法付き）

# 概要
PHPStormを愛用しています。
PHPでの開発を行っていると必ず使うPHP CS Fixerですが、その設定方法をまとめました。
特に、WSL2のUbuntu上に配置されているプロジェクトのファイルに適用する方法がいくら調べても分かりませんでしたが、今回ようやく方法を見つけたので残しておきます。

# 前提
- Windowsで開発していること
- gitbashとubuntuを併用していること

# 事前設定
PHPのインストールから記載します。PHPStormでの設定方法が知りたいせっかちさんは[こちら](#phpstormに設定)

### PHPのインストール
1. [PHPのWindows用ファイル群ダウンロードページ](https://windows.php.net/download#php-8.1)から`VS16 x64 Non Thread Safe`と書かれたzipファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/43828db6-5aad-85b3-ad1b-9d7d1d14ff97.png)
1. ダウンロードしたファイルを解凍し、フォルダー名を`php`という名前に変更し、Cドライブ直下にコピーします。
1. `php.ini-development`をコピーして`php.ini`というファイル名に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/72fb7f55-c7c1-3eac-54c1-f1a6b88f05cc.png)

### composerのインストール
1. [composer公式ページ](https://getcomposer.org/doc/00-intro.md#installation-windows)のwindows用インストーラーをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/237a3989-83dc-91cc-2314-6f350aec8b88.png)
1. ダウンロードしたインストーラーを実行してインストールします。

### PHP CS Fixerのインストール
gitbashを起動し、以下のコマンドを実行してPHP CS Fixerをインストールします。
```shell:gitbash
composer global require friendsofphp/php-cs-fixer
```
※公式ではプロジェクトのcomposer.jsonに追加することが推奨されていますが、自分の開発マシンで開発する以上必ず使うのでglobalにインストールしています。

### PHP CS Fixerの設定ファイルの作成
1. .php-cs-fixer.dist.phpという名前で設定ファイルを作ります。中身は自分好みでいいと思います。以下は私が使っている設定です。
    ```php:.php-cs-fixer.dist.php
    <?php
    return (new PhpCsFixer\Config())
        ->setRiskyAllowed(true)
        ->setUsingCache(false)
        ->setRules([
            '@PSR12'                      => true,
            'no_unused_imports'           => true,
            'ordered_imports'             => true,
            'single_import_per_statement' => false,
            'binary_operator_spaces'      => [
                'operators' => [
                    '='  => 'align',
                    '=>' => 'align',
                ],
            ],
            'array_syntax'                => ['syntax' => 'short'],
            'blank_line_before_statement' => true,
        ])
        ->setFinder(PhpCsFixer\Finder::create()->exclude('vendor')->in(__DIR__))
        ;
    ```
1. 好きな場所に移動します。
※以後はドキュメント直下に保存した前提で進めます。

# PHPStormに設定

1. PHPStormの設定ダイアログを表示し、`ツール ＞ File Watchers`を表示します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/63474480-1dd1-7bf5-1d16-bf2a0f7d830a.png)
1. ＋ボタンを押し、テンプレートは`<custom>`を選択します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/ad5c9619-bc9b-785b-65c9-4b7e9d5480e0.png)
1. 以下の内容で設定します。
    | 設定項目 | 値 |
    | - | - |
    | **名前** | 任意の名前 |
    | **ファイルタイプ** | PHP |
    | **スコープ** | 現在のファイル |
    | **プログラム** | php-cs-fixerをインストールした場所。<br>globalインストールしたので多分ユーザーフォルダー<br>例：C:\Users\Paix_\AppData\Roaming\Composer\vendor\bin\php-cs-fixer |
    | **引数** | --config="設定ファイルを配置した場所" --verbose fix "\\$FilePath\\$" |
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/1849aaaf-593e-b0e3-916f-f30a7e832b37.png)

# ここまでがWindows上のファイルにPHP CS Fixerを適用する設定
Windows上のプロジェクトのファイルにPHP CS Fixerを適用する場合はこの設定でいけるのですが、WSL2のUbuntu上のプロジェクトのファイルに対しては、この設定のままでは以下のエラーが出て変更されません。
```
cmd.exe /D /C call C:\Users\Paix_\AppData\Roaming\Composer\vendor\bin\php-cs-fixer.bat --config=C:\Users\Paix_\.php-cs-fixer.dist.php --verbose fix \\wsl$\Ubuntu\home\ubuntu\work\sample-project\TestFile.php
'\\wsl$\Ubuntu\home\ubuntu\work\sample-project'
��L�̌��݂̃f�B���N�g���� CMD.EXE ���J�n���܂����B
UNC �p�X�̓T�|�[�g����܂���BWindows �f�B���N�g��������Ŏg�p���܂��B
PHP CS Fixer 3.14.4 Oliva by Fabien Potencier and Dariusz Ruminski.
PHP runtime: 8.1.15
Loaded config default from "C:\Users\Paix_\.php-cs-fixer.dist.php".
Paths from configuration file have been overridden by paths provided as command arguments.

In Runner.php line 248:
                                                                                                            
  [Symfony\Component\Filesystem\Exception\IOException]                                                      
  Cannot write to file "\\WSL$\UBUNTU\home\ubuntu\work\sample-project\TestFile.php" as it is not writable.
```
どうもWindows上でPHP CS Fixerを動かした場合、Ubuntu上のファイルには変更を加えられないようです。バグかな。

# Ubuntu上のファイルにもPHP CS Fixerを適用する設定

1. 設定ファイルをUbuntu上の任意の場所にコピーします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/cc7c8424-a6c1-1bd9-d42a-1d55f75a79ef.png)
1. PHPStormの設定ダイアログを表示し、`ツール ＞ File Watchers`を表示します。
1. ＋ボタンを押し、テンプレートは`<custom>`を選択します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/e1e1182d-26c2-5c08-86af-41e528b2fa0c.png)
1. 以下の内容で設定します。
    | 設定項目 | 値 |
    | - | - |
    | **名前** | 任意の名前 |
    | **ファイルタイプ** | PHP |
    | **スコープ** | 現在のファイル |
    | **プログラム** | wsl |
    | **引数** | php-cs-fixer --config="設定ファイルを配置した場所" --verbose fix "\\$FileName\\$" |
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314245/f16e10ea-2e6b-446f-2d5f-018c9a3b4b88.png)

# 仕組み
PHPStormのFile Watcherはコマンドプロンプトを実行するようなので、wslコマンドを使ってUbuntuのコマンドを実行しています。

# ただし・・・
これで確かにUbuntu上のファイルを更新した場合でも対象ファイルにPHP CS Fixerが適用されるのですが、動作がクソ遅いです。
一旦WSLを呼び出してからPHP CS Fixerコマンドを実行するのですから、遅くても当然です。
他にもっといい方法があればぜひ教えてください。

# あとがき
php-cs-fixer windows ubuntu 変更されない で検索しても出てこないし、
php-cs-fixer windows ubuntu not working で検索しても出てこないしで絶望でしたが、何とかなりました。遅いけど。