3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】循環的複雑度を可視化するためにphpmdを入れた話

Last updated at Posted at 2020-02-19

Qiitaでトレンド入りしていた下記の記事を読んで
循環的複雑度を可視化し、強制的に改善させるにLaravelにphpmdを導入しました

プログラムの可読性を上げるための条件分岐を減らす方法7個
循環的複雑度について

phpmdのinstall

composer.jsonにphpmd/phpmdを追加する

composer.json
    "require-dev": {
        "phpmd/phpmd": "*"
    },

$ composer update

インストールが完了しました。

次にphpmdのルールファイル作成します

phpmd.xml
<?xml version="1.0"?>
<ruleset name="Custom_PHPMD">
    <description>Custom ruleset PHPMD</description>
    <rule ref="rulesets/codesize.xml" />
    <rule ref="rulesets/controversial.xml">
        <!-- 判定から除外: 変数名がキャメルケースかどうか -->
        <exclude name="CamelCasePropertyName" />
        <exclude name="CamelCaseParameterName" />
        <exclude name="CamelCaseVariableName" />
    </rule>
    <rule ref="rulesets/design.xml" />
    <rule ref="rulesets/unusedcode.xml" />
    <rule ref="rulesets/naming.xml">
        <!-- 判定から除外: 変数名の長さ -->
        <exclude name="LongVariable" />
    </rule>
</ruleset>
$ php vendor/phpmd/phpmd/src/bin/phpmd ファイル名 text phpmd.xml

とやれば実行できます

毎回このコマンドを書くのは面倒なので
まとめてartisanコマンドに追加しました。

artisanコマンド作成

$ php artisan make:command PhpmdCommand

app/Console/Commands/PhpmdCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class PhpmdCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'phpmd {file_path}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'phpmd';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $phpmd = base_path('vendor/phpmd/phpmd/src/bin/phpmd');
        echo shell_exec('php '.$phpmd.' '.$this->argument('file_path').' text 
 phpmd.xml');
    }
}

$ php artisan phpmd ファイル名
で毎回チェックできるようになりました。

でも修正ファイルを毎回手動で確認するのも面倒なので、
commitする際にチェックさせて、エラーがあったらcommitさせないようにしようと思います。
けっこうチェック厳しいですが、これなら絶対複雑度は下がりますよね。

git hookの設定

.git/hooks/pre-commit

.git/hooks/pre-commit

IS_ERROR=0
for file in `git diff --cached --name-only && git diff --name-only`
do
    echo $file
    ERROR_MSG=`php artisan phpmd $file`
    if  [ "$ERROR_MSG" != "" ]; then
        echo $ERROR_MSG
        IS_ERROR=1
    fi
done

if [ $IS_ERROR -eq 1 ]; then
    echo ""
    echo "Please resolve the error"
fi
exit $IS_ERROR

git commit するたびにエラーを指摘されて大変ですが、
命名規則の徹底や複雑度改善がされていい感じですね。
今後ほかのサイトにも導入してみようと思います

以下を参照して修正予定
phpmdのルール一覧
githooksのpre-pushを共有してレポジトリを健全に保つ

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?