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

## 概要
静的コード解析( PHPMD )のチェックできるようにする。

※ 今回のチェック対象は、 <font color="red">Laravel5.4のアプリ</font> です

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

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

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

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

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

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

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

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

```json:cmposer.json
{
    "require-dev": {
        "phpmd/phpmd": "*",
        "squizlabs/php_codesniffer": "2.*"
    },
    "scripts": {
        "report": [
            "./vendor/bin/phpmd ../laravel text phpmd.xml --suffixes php --exclude vendor/*,tests/*"
        ]
    }
}
```
※ エラーにしたくない場合は、下記パラメータを付けることもできる
　--ignore-violations-on-exit

※ あまりにもエラーが多い場合は、ファイルに出力することもできます
　--reportfile ./report.log

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

```sh:ターミナル
$ ./vendor/bin/phpmd --help
Mandatory arguments:
1) A php source code filename or directory. Can be a comma-separated string
2) A report format
3) A ruleset filename or a comma-separated string of rulesetfilenames

Available formats: xml, text, html.
Available rulesets: cleancode, codesize, controversial, design, naming, unusedcode.

Optional arguments that may be put after the mandatory arguments:
--minimumpriority: rule priority threshold; rules with lower priority than this will not be used
--reportfile: send report output to a file; default to STDOUT
--suffixes: comma-separated string of valid source code filename extensions, e.g. php,phtml
--exclude: comma-separated string of patterns that are used to ignore directories
--strict: also report those nodes with a @SuppressWarnings annotation
--ignore-violations-on-exit: will exit with a zero code, even if any violations are found
```

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

```xml:phpmd.xml
<?xml version="1.0"?>

<!-- PHPコードの静的コード解析ツール -->
<ruleset name="My first PHPMD rule set"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                     http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="
                     http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>
        My custom rule set that checks my code...
    </description>

    <!-- コードサイズが大きすぎないかチェック (9/10) -->
    <rule ref="rulesets/codesize.xml">
        <exclude name="ExcessiveClassComplexity" />
    </rule>

    <!-- 命名規則など議論の余地がある部分を検出するチェック (2/6) -->
    <rule ref="rulesets/controversial.xml">
        <exclude name="Superglobals" />
        <exclude name="CamelCasePropertyName" />
        <exclude name="CamelCaseParameterName" />
        <exclude name="CamelCaseVariableName" />
    </rule>

    <!-- 設計上の関連のチェック (7/7) -->
    <rule ref="rulesets/design.xml" />

    <!-- 変数名など名前関連のチェック (5/6) -->
    <rule ref="rulesets/naming.xml">
        <exclude name="ShortVariable" />
        <exclude name="ShortMethodName" />
    </rule>

    <!-- 使われていないコードのチェック (3/3) -->
    <rule ref="rulesets/unusedcode.xml" />

    <!-- 綺麗なコードかチェック (1/3) -->
    <rule ref="rulesets/cleancode.xml">
        <exclude name="ElseExpression" />
        <exclude name="StaticAccess" />
    </rule>
</ruleset>
```

※ ルールを定義したxmlファイルは以下のフォルダに存在します。
　「 <font color="red">./vendor/phpmd/phpmd/src/main/resources/rulesets/...</font> 」

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

```sh:ターミナル
$ php composer.phar install
```
※「 vendor 」フォルダにcomposer.jsonで指定した各種ライブラリがインストールされる

### PHPMD
静的コード解析を実行してみる。

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

## 参考サイト
- [PHPMD - PHP mess Detector](https://phpmd.org/documentation/index.html)
- [PHPMD - ruleset.xml](https://phpmd.org/documentation/creating-a-ruleset.html)
- [PHPの静的コード解析ツール『PHPMD』を使ってみた](https://qiita.com/yuji0602/items/28b0c2363bae8fce055a)
- [PHPMD実行時に好きなルールのみ適用する](https://qiita.com/kadoyau/items/178f412ddd93e0dd00ab)
- [PHPMDのルールセットの作り方](http://kkkw.hatenablog.jp/entry/php/phpmd-create-ruleset)
- [命名規則など議論の余地がある部分を検出するチェック](https://phpmd.org/rules/controversial.html)
- [phpmdのルール一覧](https://qiita.com/rana_kualu/items/097db09f711fe15eddb7)