コーディング規約…とても大事だけど、いつの間にか守られず数カ月後には、ぐちゃぐちゃなコードだらけになって頭を抱えるなんてことはザラにあったら困るけど、けっこう現実問題ありえるし、そんなの人的にチェックしてる暇ないし、コンピュータのほうが得意なので、そっちに任せるよ的なツール PHP Code Sniffer を使って CakePHP のコーディング規約をチェックしてみます。
ちなみに、CakePHPのコーディング規約はこちら。
コーディング規約 — CakePHP Cookbook v2.x documentation
PHP Code Sniffer のインストール
PHP Code SnifferはPEARにあるので、PEARコマンドでインストール可能。さらに、CakePHPのコーディング規約ファイルはデフォルトだと入っていないので、CakePHPのリポジトリから取り込む。
% pear install PHP_CodeSniffer
% pear channel-discover pear.cakephp.org
% pear install cakephp/CakePHP_CodeSniffer
これだけでOK。
Composerを使っている人は、Composerで。Composerの導入はこちらを参照してくださいませ。PHPのパッケージ管理Composerを使う - アプリケーションごとのライブラリ依存関係に悩まない
composer.json
{
"repositories":[{
"type":"pear",
"vendor-alias":"cakephp",
"url":"http://pear.cakephp.org"
}],
"require": {
"squizlabs/php_codesniffer": "dev-phpcs-fixer",
"cakephp/CakePHP_CodeSniffer":"*"
}
}
% composer install
Loading composer repositories with package information
Initializing PEAR repository http://pear.cakephp.org
Installing dependencies (including require-dev)
- Installing squizlabs/php_codesniffer (dev-phpcs-fixer 85ac68f)
Cloning 85ac68f990ecdd9465bd02d18d9951b10447693e
- Installing pear-pear.cakephp.org/cakephp_codesniffer (0.1.2)
Loading from cache
squizlabs/php_codesniffer suggests installing phpunit/php-timer (dev-master)
Writing lock file
Generating autoload files
これでプロジェクトディレクトリにPHP Code SnifferとCakePHP規約ファイルが入ります。ただし、CakePHP規約ファイルが所定の位置にないので、シンボリックリンクを張ります。
% cd ./vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/
% ln -s ~/Desktop/hoge/vendor/pear-pear.cakephp.org/CakePHP_CodeSniffer/PHP/CodeSniffer/Standards/CakePHP/ CakePHP
PHP Code Snifferの動作確認
% ./vendor/bin/phpcs -i
The installed coding standards are CakePHP, MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend
phpcs -i と打つと対応するコーディング規約が表示されます。その中に CakePHP があればOKです。
PHP Code Snifferで実際にCakePHPのコーディング規約チェック
phpcs コマンドで実行。ソースコード量によっては、かなり時間がかかります。
./app/ ディレクトリ下のみを対象に実行してみます。--ignoreオプションでチェックしない名前も指定できます(ワイルドカード対応/ただし使ってるシェルによる)。
% vendor/bin/phpcs --report=summary --report-checkstyle=CakePHP --standard=CakePHP --extensions=php ./app
PHP CODE SNIFFER REPORT SUMMARY
--------------------------------------------------------------------------------
FILE ERRORS WARNINGS
--------------------------------------------------------------------------------
/Users/zaru/Desktop/cakephp-2.3.9/app/Config/bootstrap.php 0 2
/Users/zaru/Desktop/cakephp-2.3.9/app/Config/core.php 0 10
/Users/zaru/Desktop/cakephp-2.3.9/app/Config/Schema/db_acl.php 1 0
/Users/zaru/Desktop/cakephp-2.3.9/app/Config/Schema/i18n.php 0 1
...s/zaru/Desktop/cakephp-2.3.9/app/Config/Schema/sessions.php 1 0
/Users/zaru/Desktop/cakephp-2.3.9/app/Console/cake.php 1 0
...ru/Desktop/cakephp-2.3.9/app/Controller/PagesController.php 2 0
/Users/zaru/Desktop/cakephp-2.3.9/app/webroot/index.php 0 1
/Users/zaru/Desktop/cakephp-2.3.9/app/webroot/test.php 0 1
--------------------------------------------------------------------------------
A TOTAL OF 5 ERRORS AND 15 WARNINGS WERE FOUND IN 9 FILES
--------------------------------------------------------------------------------
なんにもこっちでコード書いてないけど、エラーが出ている。というわけで、さらに詳しく見てみましょう。
% vendor/bin/phpcs --report=full --report-checkstyle=CakePHP --standard=CakePHP --extensions=php ./app/Controller/PagesController.php
FILE: /Users/zaru/Desktop/cakephp-2.3.9/app/Controller/PagesController.php
--------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
--------------------------------------------------------------------------------
61 | ERROR | Variable "title_for_layout" is not in valid camel caps format
70 | ERROR | Variable "title_for_layout" is not in valid camel caps format
--------------------------------------------------------------------------------
変数名がキャメルバックになってないよって事で怒られてますね。こんな感じで規約違反を見つけることが出来ます。簡単。出力フォーマットは、こういった full 表示の他にXMLやJSON、ファイル出力など細かく設定できます。
これ自体も手動で行うのではなくJenkinsなどのCIツールやGitのコミットフックで実行したり自動的にチェックするようにするのが良いでしょう。