コーディング規約の自動チェック(CodeSniffer)

## 概要
コーディング規約( PSR2 )が守られているかチェックを行うコマンドを設置する。

※ 今回のチェック対象は、 <font color="red">Laravel5.4のアプリ</font> です
※ Laravel以外のフレームワークであれば、CodeSnifferの設定を調整する

## ファイル構成
下記のようにphpcsフォルダにファイルをまとめて設置します。

```sh:ファイル構成
 ├ laravel          # ソースコード格納フォルダ
 └ phpcs
    ├ .gitignore
    ├ composer.json
    ├ composer.lock
    ├ composer.phar
    └ phpcs.xml
```
まず、フォルダを作成

```sh:ターミナル
$ mkdir -p ./phpcs/
$ cd ./phpcs/
```

## .gitignore追加
gitの除外条件を記載します。

```:.gitignore
vendor/
*.log
```

## composer追加
下記コマンドにてPHPのCompoerをインストールする。

```sh:ターミナル
$ curl -sS https://getcomposer.org/installer | php
```

## composer.json追加
下記のjsonファイルを作成します。

```json:cmposer.json
{
    "require-dev": {
        "squizlabs/php_codesniffer": "2.*"
    },
    "scripts": {
        "report": [
            "./vendor/bin/phpcs -sq --no-colors --report=source --report-diff=./report-diff.log --report-full=./report-full.log --standard=phpcs.xml"
        ],
        "convert": [
            "./vendor/bin/phpcbf --standard=./phpcs.xml"
        ]
    }
}
```

※ エラーにしたくない場合は、下記パラメータを付けることもできる
　　　--runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1

## PHP CodeSnifferのコマンド
ヘルプでオプションや設定パラメータを見てみるといろいろあるようです。

```sh:ターミナル
$ ./vendor/bin/phpcs --help
Usage: phpcs [--colors] [--no-colors] [--report=<report>] [--report-<report>=<reportFile>] ...

         Set runtime value (see --config-set) 
    -n   Do not print warnings (shortcut for --warning-severity=0)
    -s   Show sniff codes in all reports
    -q   Quiet mode; disables progress and verbose output
```

## PHP CodeSniffer 設定
下記xmlファイルを作成して、設定を記載します。

```xml:phpcs.xml
<?xml version="1.0"?>
<ruleset name="Laravel Standards">
    <description>The Laravel Coding Standards</description>

    <!-- 対象フォルダ -->
    <file>../laravel/app</file>
    <file>../laravel/config</file>
    <file>../laravel/resources</file>
    <file>../laravel/routes</file>
    <file>../laravel/tests</file>

    <!-- 除外したいファイル、ディレクトリ -->
    <exclude-pattern>*/database/*</exclude-pattern>
    <exclude-pattern>*/cache/*</exclude-pattern>
    <exclude-pattern>*/*.js</exclude-pattern>
    <exclude-pattern>*/*.css</exclude-pattern>
    <exclude-pattern>*/*.xml</exclude-pattern>
    <exclude-pattern>*/*.blade.php</exclude-pattern>
    <exclude-pattern>*/autoload.php</exclude-pattern>
    <exclude-pattern>*/storage/*</exclude-pattern>
    <exclude-pattern>*/docs/*</exclude-pattern>
    <exclude-pattern>*/vendor/*</exclude-pattern>
    <exclude-pattern>*/migrations/*</exclude-pattern>

    <!-- PSR2をベースとする -->
    <rule ref="PSR2">
        <!-- 除外したい項目 -->
        <exclude name="Generic.Files.LineLength.TooLong"/>
    </rule>

    <arg name="colors"/>
    <arg value="p"/>

    <ini name="memory_limit" value="128M"/>
    <rule ref="PSR2"/>
</ruleset>
```

## 各種ライブラリをインストール

```sh:ターミナル
$ php composer.phar install
```

## コマンド実行
### レポート出力
コーディング規約(PSR2)に準拠しているかチェックしてみる。

```sh:ターミナル
$ php composer.phar report
```
※細かい結果は、下記ファイルに出力されます。
　・ ./phpcs/report-diff.log
　・ ./phpcs/report-full.log

### 自動変換
コミット前にどのように修正されているかは確認した方がいいかもしれません。

```sh:ターミナル
$ php composer.phar convert
```

## 参考サイト
- [PHP_CodeSnifferとPHPMDを使って自動的にコードを少しでも綺麗にする](https://simple-it-life.com/2016/12/03/php-check/)
- [PHP_CodeSnifferでコードの規約チェックと自動整形を行う](http://takedajs.hatenablog.jp/entry/2017/05/03/113539)
- [PHP CodeSniffer を試す](https://qiita.com/teratsyk/items/fa04ff84d5d47cfb4f3a)
- [PHPの静的コード解析ツール『PHPMD』を使ってみた](https://qiita.com/yuji0602/items/28b0c2363bae8fce055a)
- [squizlabs/PHP_CodeSniffer - Annotated ruleset.xml](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-ruleset.xml)
- [squizlabs/PHP_CodeSniffer - Fixing Errors Automatically](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Fixing-Errors-Automatically)
- [Github - paulund/phpcs.xml](https://gist.github.com/paulund/8aacc8e8216c21136c182576fc078ec4)
- [composer testでQAツールの実行](https://qiita.com/koriym/items/036dc0ceda5606be473b)
- [PHP CodeSnifferでコーディング規約を守れているかチェックしてみる。](https://qiita.com/karumado/items/3ff84343d03866586021)
- [Github - phpmd/phpmd](https://github.com/phpmd/phpmd/blob/master/composer.json)
- [やさしいPHPコーディング規約の導入・完全版](http://tech.connehito.com/entry/2016/04/18/121719)