CakePHP 3 に PHP_CodeSniffer を入れてコードをキレイに保つ

はじめに

今日は CakePHP3 で PHP_CodeSniffer を実行する方法と、ちょっと便利にするテクニックをご紹介します。

CakePHPのバージョンは3.8で実行しています。
コマンドは Linux / Unix 系でご紹介しますが、Windowsでも動作します。

目次
  1. PHP_CodeSniffer をインストール
  2. phpcs で不備ありファイルを抽出
  3. phpcs のバッチ/シェルスクリプトを作成
  4. phpcbf で不備ありファイルを自動整形
  5. phpcbf のバッチ/シェルスクリプトを作成
  6. おわりに

1. PHP_CodeSniffer をインストール

下記コマンドでプラグインをインストール。

$ cd /path/to/cake3project/
$ composer require squizlabs/php_codesniffer --dev

2. phpcs で不備ありファイルを抽出

PHP_CodeSniffer には phpcs と phpcbf の、2つのコマンドが含まれています。
phpcs(PHP CodeSniffer) は、コードの不備を一覧で表示するもの。
phpcbf(PHP Code Beautifier)は、コードを自動整形するものです。

まずは phpcs を使ってみます。コードに問題がなければ以下のように表示されます。

$ ./vendor/bin/phpcs -p --colors --standard=./vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests
........... 11 / 11 (100%)

Time: 276ms; Memory: 8MB

問題がある場合は、以下のようにファイルパスと行番号、エラー内容が表示されます。

..E.E...... 11 / 11 (100%)

FILE: /path/to/cake3project/src/Controller/AppController.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
  60 | ERROR | Missing parameter comment
----------------------------------------------------------------------

~~~ 省略 ~~~

Time: 747ms; Memory: 8MB

結果の見方は説明を割愛しますが、コマンドのオプションについて簡単にご説明します。

-pは進捗状況を表示。
--colorsは結果を色付きで表示。
--standardはコーディングルールを指定するものです。

他のオプションも含め、詳しくは下記コマンドで確認できます。

$ ./vendor/bin/phpcs --help

3. phpcs のバッチ/シェルスクリプトを作成

毎回この長いコマンドを入力したり、コピペするのは面倒なので、Windows用のバッチファイルと、Mac用のシェルスクリプトを作りました。

僕は、/path/to/cake3project/bin の中に入れています。

3-1. Win用 phpcs バッチファイル

/bin/phpcs.bat
@echo off

set SITE_DIR=%~dp0%..\
set VENDOR_DIR=%SITE_DIR%vendor\

call %VENDOR_DIR%bin\phpcs -p --colors --standard=%VENDOR_DIR%\cakephp\cakephp-codesniffer\CakePHP %SITE_DIR%\src %SITE_DIR%\tests

上記バッチは、下記コマンドで実行可能です

C:\path\to\cake3project> bin\phpcs

3-2. Mac用 phpcs シェルスクリプト

/bin/phpcs
#!/usr/bin/env sh
script_dir=$(cd $(dirname $0); pwd)
site_dir=$(cd $(dirname $script_dir); pwd)
vendor_dir="$(cd $site_dir; pwd)/vendor"

${vendor_dir}/bin/phpcs -p --colors --standard=${vendor_dir}/cakephp/cakephp-codesniffer/CakePHP ${site_dir}/src ${site_dir}/tests

上記シェルスクリプトは、下記コマンドで実行可能です。bin/phpcs に実行権限が付与されていることをご確認ください。

$ bin/phpcs

4. phpcbf で不備ありファイルを自動整形

phpcsと同様に、下記コマンドで実行可能です。コマンドの各オプションの意味も同じです。修正可能な箇所がない場合は下記のように表示されます。

$ ./vendor/bin/phpcbf -p --colors --standard=./vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests
........... 11 / 11 (100%)

No fixable errors were found

Time: 269ms; Memory: 8MB

不備があり、自動整形した場合は下記のようになります。

....F...... 11 / 11 (100%)

PHPCBF RESULT SUMMARY
----------------------------------------------------------------------
FILE                                                  FIXED  REMAINING
----------------------------------------------------------------------
/path/to/cake3project/src/Controller/PagesController.php  2      1
----------------------------------------------------------------------
A TOTAL OF 2 ERRORS WERE FIXED IN 1 FILE
----------------------------------------------------------------------

Time: 296ms; Memory: 8MB

ここで注意が必要で、phpcbf はすべての不備を直してくれるわけではありません

phpcbf 実行後は phpcs で不備が残っていないか確認してください。

5. phpcbf のバッチ/シェルスクリプトを作成

こちらもバッチファイルとシェルスクリプトを作りました。内容は phpcs のときとほぼ同じです。

5-1. Win用 phpcbf バッチファイル

/bin/phpcbf.bat
@echo off

set SITE_DIR=%~dp0%..\
set VENDOR_DIR=%SITE_DIR%vendor\

call %VENDOR_DIR%bin\phpcbf -p --colors --standard=%VENDOR_DIR%\cakephp\cakephp-codesniffer\CakePHP %SITE_DIR%\src %SITE_DIR%\tests

上記バッチは、下記コマンドで実行可能です

C:\path\to\cake3project> bin\phpcbf

5-2. Mac用 phpcbf シェルスクリプト

/bin/phpcbf
#!/usr/bin/env sh
script_dir=$(cd $(dirname $0); pwd)
site_dir=$(cd $(dirname $script_dir); pwd)
vendor_dir="$(cd $site_dir; pwd)/vendor"

${vendor_dir}/bin/phpcbf -p --colors --standard=${vendor_dir}/cakephp/cakephp-codesniffer/CakePHP ${site_dir}/src ${site_dir}/tests

上記シェルスクリプトは、下記コマンドで実行可能です。bin/phpcbf に実行権限が付与されていることをご確認ください。

$ bin/phpcbf

6. おわりに

必死にコードを書いていると、ついついルールから外れた記述になってしまうことがあります。phpcs と phpcbf を使えば、コード整形の手間や時間を減らすことが可能です。使ったことがない方は、ぜひ一度試してみてください。