【PHP】さくっとスタイル・フォーマットチェック

# 前置き
ルールが整っていない現場に入ったときに、
コードのスタイルやフォーマットなどで指摘を受けたくないので、
レビュー前に最低限のチェックができる環境を作りたい。

・・エディタに任せるのが一番だと思いますが。

# 概要
[1]Dockerコンテナにphing入れる
[2]対象ソースのディレクトリを共有にしてコンテナ起動
[3]中に入ってphing実行

※phpcsとphpmdをとりあえず入れていますが、目的に応じて追加したりしてください

# 実施
## dockerいれる
[【さらっとだけ覚えたい】Docker入門](http://qiita.com/tsuuuuu_san/items/dfd1d6ac55244d64d076)

## ホストに必要なファイルを配置
以下をどこかに配置してください。
[1]Dockerfile
[2]composer.json
[3]build.xml(phing用)
[4]ruleset.xml(phpmd用)

phpcsはPSR2、phpmdのチェックルールに不満がなければ、
下記をコピペでおつかいいただけるかと。

```yaml:Dockerfile
FROM centos:6.7

RUN yum update -y
RUN yum install -y yum-plugin-ovl

# Japanese Support
RUN yum -y groupinstall "Japanese Support"
RUN echo "LANG=\"ja_JP.UTF-8\"" > /etc/sysconfig/i18n
RUN source /etc/sysconfig/i18n

# ntp
RUN cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# php
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN yum install -y --enablerepo=remi php php-xml

# composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
RUN chmod 777 /usr/local/bin/composer

# create phing dir
RUN mkdir -p /phing/src
RUN mkdir -p /phing/phpmd

ADD ./composer.json /phing/composer.json

RUN cd /phing && composer install --dev

RUN ln -s /phing/vendor/phing/phing/bin/phing /usr/local/bin/phing
RUN ln -s /phing/vendor/squizlabs/php_codesniffer/scripts/phpcs /usr/local/bin/phpcs
RUN ln -s /phing/vendor/phpmd/phpmd/src/bin/phpmd /usr/local/bin/phpmd
RUN chmod 777 /usr/local/bin/phing
RUN chmod 777 /usr/local/bin/phpcs 
RUN chmod 777 /usr/local/bin/phpmd 

ADD ./build.xml /phing/build.xml
ADD ./ruleset.xml /phing/ruleset.xml
```

```json:composer.json
{
     "require-dev": {
        "squizlabs/php_codesniffer": "2.*",
        "phpmd/phpmd" : "@stable",
        "phing/phing": "2.*"
    }
}
```

```xml:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- buildタスクをデフォにしておく -->
<project name="phing" default="build">

  <!-- ソース置き場などはプロパティとして使用する -->
  <property name="myDir" value="/phing" />
  <property name="targetDir" value="/phing/src/" />

  <!-- buildタスク -->
  <target name="build" depends="phpcs,phpmd" />

  <!-- 静的解析ツールの設定 -->
  <target name="phpcs">
    <phpcodesniffer standard="PSR2" file="${targetDir}" allowedFileExtensions="php" />
  </target>

  <target name="phpmd">
    <phpmd rulesets="ruleset.xml">
      <fileset dir="${targetDir}">
        <include name="**/*.php" />
      </fileset>
      <formatter type="html" outfile="${myDir}/phpmd/phpmd.html"/>
      <formatter type="text" outfile="${myDir}/phpmd/phpmd.txt"/>
    </phpmd>
  </target>
</project>
```

```xml:ruleset.xml
<?xml version="1.0"?>
<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>

    <rule ref="rulesets/cleancode.xml" />
    <rule ref="rulesets/codesize.xml" />
    <rule ref="rulesets/controversial.xml" />
    <rule ref="rulesets/design.xml" />
    <rule ref="rulesets/naming.xml" />
    <rule ref="rulesets/unusedcode.xml" />
</ruleset>
```

## コンテナ起動
```
docker build -t phing:latest .
docker run -itd --name phing --volume ソースのあるディレクトリ:/phing/src phing
docker exec -it phing /bin/bash
```

## チェック
```
cd /phing
phing
```

※phpmdの結果は/phing/phpmd配下に吐くように設定してます

# おまけ
## 静的解析ツールの単体実施
```bash:phing
phing タスク
```

```bash:phpcs
phpcs --standard=PSR2 src/
```

```bash:phpmd
phpmd [ファイル名|ディレクトリ] [レポートフォーマット（text or xml）] [ルール]
```

|phpmdルール|説明|
|:--|:--|
|cleancode|汚いコードに指摘|
|codesize|メソッドやクラスの大きさに対して指摘|
|controversial|キャメルケースを勧める|
|design|ソフトウェアデザインに関連した指摘|
|naming|命名ルール|
|unusedcode |使われていないコードの指摘|