CodeSnifferを利用してコーディング規約を自動チェック

#初めに
開発を行っていく中、コーディング規約(PSR12)が守られているかをチェックを行うことは必須です。
しかし、自分で目視してもどこかで見落としがあったりリファクタリングに時間がかかったりしないでしょうか？

そんな時に、自動でコーディング規約を守られているかをチェックするツールが<font color="Red"> CodeSniffer </font>です。

※今回のチェック対象は<font color="Red"> Laravel8 </font>のWebアプリケーションです。

#PSR12とは

>PSR-12 は、コーディングスタイルガイドである PSR-2 の拡張および置き換えと、基本的なコーディング標準である PSR-1 への準拠が必要になります。
PSR-2 と同様に、PSR-12 の目的は、異なる作成者のコードを理解する（読む）際の認識の摩擦を減らすことです。

詳しい詳細は以下URLを参照。
[【PHP】PSR-12 Extended Coding Style（拡張コーディングスタイル）](https://www.ritolab.com/entry/208#:~:text=%E7%84%A1%E5%90%8D%E3%82%AF%E3%83%A9%E3%82%B9-,%E6%A6%82%E8%A6%81,%E6%91%A9%E6%93%A6%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)

なお、LaravelはPSR2が非推奨となりPSR12を使用することを推奨されています。

#CodeSnifferを実際に使う

###composerを利用する場合
#####1. composer.jsonに記載する

```composer.json
"require-dev": {
        "squizlabs/php_codesniffer": "3.*"
    }
```
#####2. composer updateを実行

```
$ composer update
```

#####3. phpcs.xmlを作成し、ルールや設定を定義

```phpcs.xml
<?xml version="1.0"?>
<ruleset name="PSR12 Custom">
    <description>A custom PSR12</description>

    <arg name="extensions" value="php" />

    <!-- 適用コーディング規約の指定 -->
    <rule ref="PSR12" />

    <!-- 出力に色を適用 -->
    <arg name="colors" />

    <!-- オプション p:進捗表示  s:エラー表示時にルールを表示 -->
    <arg value="ps" />

    <!-- 除外ディレクトリ -->
    <exclude-pattern>/bootstrap/</exclude-pattern>
    <exclude-pattern>/config/</exclude-pattern>
    <exclude-pattern>/database/</exclude-pattern>
    <exclude-pattern>/node_modules/</exclude-pattern>
    <exclude-pattern>/public/</exclude-pattern>
    <exclude-pattern>/resources/</exclude-pattern>
    <exclude-pattern>/routes/</exclude-pattern>
    <exclude-pattern>/storage/</exclude-pattern>
    <exclude-pattern>/vendor/</exclude-pattern>
    <exclude-pattern>/server.php</exclude-pattern>
    <exclude-pattern>/app/Console/Kernel.php</exclude-pattern>
    <exclude-pattern>/tests/CreatesApplication.php</exclude-pattern>
</ruleset>
```

・コーディング規約として<font color="Red"> PSR12 </font>を指定。
・エラーレポート出力時に色付けする。
・オプションとして、エラー表示時にルールを表示する事、進捗を表示する事を指定。
・除外するディレクトリやファイルを指定。今回はLaravelのコアソースをなるべく除外し、appとtestsディレクトリ内をチェックするようにする。

#####4.結果 コマンドを実行する
コマンドが長いため、composer.jsonのscripts内に記載して`composer update`を実行

```composer.json
"scripts": {
    "phpcs": [
            "./vendor/bin/phpcs --standard=phpcs.xml ./"
        ]
    }
```

**Before**

```
$ ./vendor/bin/phpcs --standard=phpcs.xml ./
```

**after**

```
$ composer phpcs
```

コーディング規約でエラーがあれば出力されるが、なければ以下のように表示される

```
> ./vendor/bin/phpcs --standard=phpcs.xml ./

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
........................... 27 / 27 (100%)

```


###PHPStromで設定する場合
#####1. Preferencesを開く
PHPStrom->Preferences
![スクリーンショット 2022-02-17 1.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/d1d3d562-41ec-9663-192d-a38f4b48933d.png)

#####2. コードスタイルでPHPを選択
Editor->Code Style->PHP
![スクリーンショット 2022-02-17 1.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/c52d4a33-788e-7f1b-d824-3816c2867547.png)

#####3. Set formを押してPSR12を選択
![スクリーンショット 2022-02-17 10.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/1a9bc465-5c8d-77c8-bbe4-6d211c4f33f8.png)


#####4. コードのリフォーマットを実施
以下コマンドを実行
**Macの場合**: option + Cmd + L
**Windows**: Alt + Ctrl + L

#終わりに
今回は、開発効率を上げる上で自動化できるライブラリを紹介しました。
実際に実務に入ると、コーディング規約に違反したソースコードを書いていてはNGです。

CodeSnifferはコーディング規約の対策として非常に簡単なものなので、ぜひご参考になれば幸いです。

最後までお読みいただき、ありがとうございました！


####■参考サイト
[Laravel入門　コーディング規約PSR12への対応とphp_codesniffer（第19回）]
(https://www.laravuejs.dev/tutorials/laravel-s1/laravel-115/)

[【PHP】PSR-12 Extended Coding Style（拡張コーディングスタイル）](https://www.ritolab.com/entry/208#:~:text=%E7%84%A1%E5%90%8D%E3%82%AF%E3%83%A9%E3%82%B9-,%E6%A6%82%E8%A6%81,%E6%91%A9%E6%93%A6%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)

[LaravelにPHP_CodeSnifferを導入しコーディング規約（PSR）に沿った記述を行う](https://www.ritolab.com/entry/188)

[squizlabs/PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer)