PhpStorm/PHPStan/PHP CS Fixerを組み合わせてコード品質をよくしよう！

# これは何？
:::note info
[LITALICO Engineers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/litalico) 1日目の記事です
:::

この記事では、
- PhpStormの`File Watchers`機能
- PHP-CS-Fixer
- PHPStan

上記のツールを利用して、PhpStorm上にて、任意のPHPファイルを保存した際にPHPStanとPHP CS Fixerを走らせてコード品質を担保する方法を説明します。

## メリット

- PHP CS Fixerによるコード整形にて、インデントやスペースといった余計なレビューコストが低減できる
- PHPStanのルールに従うことで、より堅牢なコードが書け、バグを低減できる

## デメリット
- ファイル保存時に処理が走るようになるので、数秒の待ち時間が発生するようになる

ということがあります。

# 筆者の想い
PhpStormはPHPを書く際の最高のパートナーだと筆者は信じています。これはこれまでの自分へ対する反省でもあるのですが、PhpStormと各種ツールを連携することによって、さらなる高みを目指すことができます。この記事が少しでも読者の皆様のPhpStormライフに貢献できることを祈っております。



# 記事の注意事項
## 対象者
今回の記事が役立つ人は、以下の人を想定しています
- PhpStormを利用している人
- PHPStanを利用しているいる人
- PHP-CS-Fixerを利用している人
- ローカル環境でPHPを動かしている人
    - DockerでPHPを動かしている場合、設定が微妙に異なります。そこに関しては別記事で解説するかもしれません。

## やらないこと
以下の内容は今回の記事では解説は特段行いません。

- PHPStanの具体的な設定方法の解説
- PHP CS Fixerの具体的な設定の解説

具体例については、筆者のサンプルコードを共有しますので参考にされてください。

#  各種リンクについて
今回利用するツールについての詳細は以下のリンクを確認ください。

-  [PhpStormのFile Watchers機能の詳細](https://www.jetbrains.com/help/phpstorm/using-file-watchers.html)
-  [PHPStanの公式ドキュメント](https://phpstan.org/user-guide/getting-started)
- [PHP CS FixerのGitHub](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer)

PHPStan/PHP CS Fixerの導入方法や設定ファイルの作成方法については上記のリンクやZenn, Qiitaの記事などをご参照ください。

# 前提条件について
今回の記事における開発環境の前提は以下のとおりです。
- mac OS Ventura
- PHP 8.1
    - 今回はDockerは利用せず、ローカルで動かします。brewなどにてインストールができているものとします
- PHPStanがcomposer経由にてインストールされており、設定が済んでいること
    - 補足として 今回はLaravelプロジェクトなのでPHPStanラッパーのLarastanを利用しています
    - PHPStanの具体設定例は、こちらを確認ください。 -> [サンプルコード](https://github.com/tyamahori/laravel-template/blob/main/src/phpstan.neon)
- PHP CS Fixerがcomposer経由にてインストールされており、設定が済んでいること
    - PHP CS Fixerの具体的設定例はこちらを確認ください -> [サンプルコード](https://github.com/tyamahori/laravel-template/blob/main/src/.php-cs-fixer.dist.php)

# 設定方法について
ここからは、PhpStom上にて、PHPStanとPHP CS Fixerの設定方法について説明をしていきます。
1. CLI Interpretersの設定
1. PHPStanとの連携設定
1. PHP CS Fixerとの連携設定
1. File Watchers機能の設定

## CLI Interpreters
まずは、PhpStormにて、PHPと連携をする設定をしていきます。

### 参考URL
ドキュメントは以下が参考になると思いますので、こちらの記事の確認もおすすめいたします。
- https://www.jetbrains.com/help/phpstorm/configuring-local-interpreter.html
- https://pleiades.io/help/phpstorm/configuring-local-interpreter.html

### CLI Interpretersの設定手順
ショートカットキー`command + ,` にて設定画面を開きます。おそらく何も設定していない場合は、CLI Interpreter: が`<no interpreter>` となっているかと思います。脇の`...` のところをクリックして、新規追加設定を行います。
![php-interpreter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/a89ab9d1-6c5d-c6b9-6381-621b52a94053.png)

---

設定画面が登場します。キャプチャでは筆者の既存設定が表示されております。一旦ここは無視して、左上の`+` をクリックします。
![php-interpreter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/5a9998a8-5c31-bd61-f565-589e4fa7a01e.png)


---

`Local Paht to Interpreter...`  をクリックします。
![php-interpreter-local.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/443b10e8-3ae7-4673-fd41-94f2cef38c54.png)


---

`PHP (1)` というものが作成されました。これを設定していきます。
![php-interpreter-local-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/66645963-0315-2af3-cdd3-571d0e1c9539.png)


---

- `Name:` 今回は `PHP-Advent`と命名しました。ここは任意でわかりやすいものを設定してください。
- `PHP executable:` は `/opt/homebrew/bin/php` と設定しました。homebrewでインストールしたPHPを今回は設定します。
- これにてキャプチャ右下の`Apply` をクリックし、その後`OK`をクリックします 

![php-interpreter-local-advent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/db5daa65-9afc-0665-6535-ff0aadb14927.png)

---

Preferencesに戻ります。`CLI Interpreter:` にて、`PHP-Advend`と設定されていることが確認できます。
![preference-php-advent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/23401981-fa79-b02c-d30b-a94b2557d349.png)


これにてCLI Interpretersの設定は終わりです。

## PHPStan
PhpStormにて、PHPStanと連携をする設定をしていきます。

### 参考URL
ドキュメントは以下が参考になると思いますので、こちらの記事の確認もおすすめいたします。
- https://www.jetbrains.com/help/phpstorm/using-phpstan.html

### PHPStanの設定手順
まずは、ショートカットキー`command + ,` にて設定画面を開きます。
そこから `PHP` ->  `Quality Tools` -> `PHPStan` へとアクセスしてください。そこで`Configration`を 先程作成した `PHP-Advent`と設定してください。
そして`...`をクリックしてください。

![phpstan-configuration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/0e6eb745-010f-4a6c-7299-e34638491cf2.png)

---

クリックしたあとのキャプチャです。既存の設定がありますが、左上の`+` を押して新しく追加を行います。

![phpstan-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/1219c6ef-0617-22ff-28c6-328184c82426.png)

---

PHPStan By Interpreterは設定した、`PHP-Advent` を設定します。そして、`OK` を押します。

![phpstan-setting-add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/a1cb7fe2-24d9-6855-f495-a559dd6c76d2.png)

---

`PHP-Advent` が選ばれていると思います。また、`PHPStan path`の設定もしてください。自分の場合は、ローカル環境のvendorディレクトリある phpstanをパスとして設定しています。
`Validate` を押して設定が有効になるかもチェックします。

![phpstan-after-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/8ec79ef7-7629-f8ae-c300-2d07daae5cf0.png)


`OK, PHPStan...` という表記が下側に出たらOKです。
そして、 `PHPStan inspection` をクリックしてください

![phpstan-after-ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/d6e7e1d2-91d8-1185-5d9c-262937021e59.png)

---

左側にある、`Quality tools` -> `PHPStan validation` にてチェックを入れます。
また、右側下部分の`Options`の設定を行います。 
- `Level` -> プロジェクトに応じたものを設定します。個人的には`8` をおすすめします。高みをめざしましょう！
- `Configuration file` -> phpstan.neonという設定ファイルのパスを設定します。
- その他の設定はありますが、一旦このままで行きます。右下の`OK`をクリックしてください。

![phpstan-inspection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/1f358116-ad8d-e192-8633-21e10aba9c8f.png)

---

この画面に戻れたら、PHPStanの設定が終わりです。
`Apply`をクリックして、その後に `OK`をクリックしてください
![Preference-phpstan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/9ee0e933-72b0-8d24-02d7-eb983eae30ee.png)

---

#### memo
PHPStanとPhpStormの連携設定を行うことで、今後PHPファイルを編集している際にPHPStanによるエラーが有った際に、PhpStormが怒ってくださるようになります。必要に応じて対応してください。

![phpstan-warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/95f68352-8282-4d15-77d6-819ade5251a7.png)

## PHP CS Fixer
PhpStormにて、PHP CS Fixerと連携をする設定をしていきます。File Watchersと連携する場合においては、直接は必要とはなりませんが設定しておくと何かしらと便利になります。

### 参考URL
ドキュメントは以下が参考になると思いますので、こちらの記事の確認もおすすめいたします。
- https://www.jetbrains.com/help/phpstorm/using-php-cs-fixer.html
- https://pleiades.io/help/phpstorm/using-php-cs-fixer.html

### PHP CS Fixerの設定手順
まずは、ショートカットキー`command + ,` にて設定画面を開きます。
そこから `PHP` ->  `Quality Tools` -> `PHP CS Fixer` へとアクセスしてください。そこで`Configration`を 先程作成した `PHP-Advent`と設定してください。

そして、右側の`...`をクリックしてください
![phpcsfixer-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/b595681b-428a-27d4-6966-5f5c8c845661.png)

---
`...` をクリックしたあとに出る画面です。
PHP CS Fixerの設定を進めていきます。既存の設定が出てしまっているので、新しいPHP CS Fixerの設定追加を行います。画面左上の`+` を押します。

![php-cs-fixer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/92705891-6c3f-daa5-a6ae-7c28a3764653.png)

---

`+` を押したあとにPHP CS Fixerを動かすInterpreter を設定できます。今回は`PHP-Advent`を選び、`OK`を押します。
そして、右下の `Apply` と `OK` をクリックします。
![php-cs-fixer-by-interpreter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/475f59de-90f2-05b2-1264-dc173a301ad7.png)

---

 `PHP-Advent`が設定できていれば成功です。また、`PHP CS Fixer path` を設定してください。`Validate`を押して、エラーが発生しなければ設定は成功です。

**そしてここからがポイントになります!!**  `PHP CS Fixer inspection` をクリックします。

![php-cs-fixer-advent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/79be5119-e90b-6ff9-05cc-be45865e4089.png)

---

PHP CS Fixerの詳細設定を行います。
キャプチャ左側の `PHP CS Fixer validation` にはチェックを入れておきます。
キャプチャ右下側の`Options` の設定が大切です。
- `Allow resky rules for build-in rulesets` は チェックしておきます。
- `Ruleset:` は `Custom`を設定します。(独自のPHP CS Fixerの設定をしている前提です)
- `...` をクリックして、PHP CS Fixerの設定ファイルのパスを設定します。

![php-cs-fixer-inspections.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/ed305924-d2b7-6ecd-46de-9560a5604ea4.png)

---

パスを設定します。`OK`をクリックします。
パスの設定ダイアログが閉じるので、その後に右下の`OK` をクリックします

![php-cs-fixer-setting-path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/64a67977-2bc2-10cf-b02b-326d8497e8e9.png)

---

設定画面に戻るので、 `Apply`, `OK` をクリックします

![php-cs-fixer-advent (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/0a333edb-c7f3-9ea1-9c84-59470b7766d1.png)

---

その後この画面に戻ればOKです。

![phpcsfixer-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/88b6e1a9-9a44-ec1e-32a0-0c3a67bb2a37.png)

---

## File Watchers
PhpStormにて、File Watchersの設定をしていきます。

### 参考URL
ドキュメントは以下が参考になると思いますので、こちらの記事の確認もおすすめいたします。
- https://www.jetbrains.com/help/phpstorm/using-file-watchers.html
- https://pleiades.io/help/phpstorm/using-file-watchers.html

### File Watchersの設定手順
まずは、ショートカットキー`command + ,` にて設定画面を開きます。`Tools` -> `File Watchers` を選択したら、設定画面が開けると思います。

キャプチャでは、既存の設定がありますが、新しく追加設定の対応を行います。`+` をクリックします。
![file-watchers-preference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/f69d1c11-75df-5058-cd3d-ea43d3933d76.png)

---

設定画面が出てきますので、File Watchersの設定を進めます。

- `Name:` -> 今回は、`php-cs-fixer-advent` と設定しました。
- `File Type:` -> `PHP`と設定をします
- `Scope:` -> `Project Files` を選択します。
- `Program:` -> php-cs-fixerのファイルパスを記載します。
- `Arguments:` -> `fix "$FilePath$"` と入れます。 `$FilePath$`は、特別な記述です。動的に保存したファイルのパスがここに格納されます。
- `Working directory:` -> `$ProjectFileDir$`といれます。 `$ProjectFileDir$`も特別な記述です。動的にプロジェクトファイルのディレクトリを取得してくれます。
- `Advanced Options` -> チェックはキャプチャの通りすべて外してください。

キャプチャと同様の設定になりましたら`OK`を押します

![filewatchers-php-cs-fix-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/d04a21ed-d106-cca5-9c45-6e8c63b397a8.png)

---

設定が追加できたことを確認します。
次は、PHPStanを動かすようにします。`+` をクリックします。

![filewatchers-php-cs-fixer-done.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/5490ca5d-9996-9611-b7ab-0c6f352b427c.png)

---

以下のような設定をします。

- `Name:` -> `phpstan-advent` と設定します。
- `File type:` -> `PHP`と設定します
- `Program:` -> phptanのファイルパスを設定します。
- `Arguments:` -> `analyse "$FilePath$"` と入れます。 `$FilePath$`は、特別な記述です。動的に保存したファイルのパスがここに格納されます。
- `Working directory:` -> `$ProjectFileDir$`といれます。 `$ProjectFileDir$`も特別な記述です。動的にプロジェクトファイルのディレクトリを取得してくれます。
- `Advanced Options` -> チェックはキャプチャの通りすべて外してください。

そして、`OK`をおします

![filewatchers-phpstan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/1b598655-3292-4c62-c960-3fa96b8bd26e.png)

---

設定一覧に戻ると追加されています。`Enabled` のチェックを設定します。既存のものは外し、新しく追加したものはチェックします。

そして、右下の `Apply`, `OK` をクリックします

![filewachers-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/e9c05d39-6b55-bbfb-914f-1dae9be3ab6e.png)

# 挙動確認
以下のようになれば成功です。

## PHP CS Fixer
ファイル保存時にフォーマッタが走ります。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/e423b54b-2d81-8066-5594-1bf693fd786a.gif)




## PHP Stan
ファイル保存時に怒られれば成功です。
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200282/732774bd-a46c-8bc6-eb77-403851a5130b.gif)



# 最後に
これにてすべての設定は終わりです。お読みいただきましてありがとうございました。PhpStorm/PHPStan/PHP CS Fixerをうまく組み合わせることで、コードをより良くできるかなと思っています。皆様のより良いPHPライフを祈っております。また、より堅牢なPHPを書きたい方はぜひ声をかけてくださると嬉しいです。

:::note info
明日は、[LITALICO Engineers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/litalico) 2日目の記事です。[@powsato](https://qiita.com/powsato) が担当します。どうぞお楽しみに！
:::


## ちなみに。。。
弊社、[絶賛採用活動中](https://jobs.qiita.com/postings?employer=101&utm_source=qiita&utm_medium=organization)です。応募する際は、tyamahoriの記事を見たと言ってもらえたらとても喜びます笑