All Articles

Laravel Statsを使ったソースコードの分析

2019年9月1日にv2.0がリリースされました🎉

私はv2.0になってからこのパッケージの存在を知ったので、写経用に作成していたLaravelプロジェクトの更新を兼ねてインストールしてみました。

インストール条件

v2.0を使用する場合は次の条件を満たしている必要があります。

  • PHP 7.2以上
  • Laravel v5.8以上もしくはLumen v5.8以上

Lumenでも使用可能とのことですが、今回はLaravelプロジェクトでの使用方法を記述します。

インストール

次のコマンドを実行することでインストールできます。

$ composer require "wnx/laravel-stats" --dev

サービスプロバイダーの設定は自動で行われますが、手動で行う場合はconfig/app.phpに次のコードを追加できます。

'providers' => [
    // ...
    \Wnx\LaravelStats\StatsServiceProvider::class,
]

別途コンフィグファイルを作成する場合は以下のコマンドを実行することで作成されます。

$ php artisan vendor:publish --provider="Wnx\LaravelStats\StatsServiceProvider"

実行が完了すると以下のようなファイルがconfig/stats.phpとして作成されます。(以下のコードはコメントを書き換えています。)

<?php

return [

    /*
     * 出力対象のパス
     */
    'paths' => [
        base_path('app'),
        base_path('database'),
        base_path('tests'),
    ],

    /*
     * 出力対象外とするファイル・ディレクトリ
     */
    'exclude' => [
        base_path('tests/bootstrap.php'),
        // base_path('app/helpers.php'),
        // base_path('app/Services'),
    ],

    /*
     * 独自で出力対象を増やす場合はここに追加する。後述。
     */
    'custom_component_classifier' => [
        // \App\Classifiers\CustomerExportClassifier::class
    ],

    /*
     * 対象外とするルール。
     * デフォルトではvendorディレクトリ以下とコアクラスが対象外となっている。
     *
     * 以下の2ファイルがデフォルトで用意されている。
     * - \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class
     * - \Wnx\LaravelStats\RejectionStrategies\RejectInternalClasses::class
     *
     * 上記ファイルのルール以外にしたい場合は、`Wnx\LaravelStats\Contracts\RejectionStrategy`を実装したクラスを別途作成する必要がある。
     */
    'rejection_strategy' => \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class,

    /*
     * 対象外とする名前空間。
     * `Str::startsWith()`で対象外かを判別している。
     *
     * `Illuminate`を指定することでIlluminate全体を対象外に出来る。
     * また`Illuminate\Support`のように一部を対象外にすることも可能。
     */
    'ignored_namespaces' => [
        'Wnx\LaravelStats',
        'Illuminate',
        'Symfony',
    ],

];

使い方

artisanコマンドで実行することができます。

$ php artisan stats

以下の画像のような出力結果になります。

画像入れる

オプション

オプション 説明
—json json形式で出力
—components[=COMPONENTS] 出力対象を指定して出力
-h, —help ヘルプの表示
-q, —quiet 結果を出力しない
-V, —version バージョンの表示
—ansi ANSIで出力
—no-ansi ANSIで出力しない
-n, —no-interaction 対話形式にしない
—env[=ENV] 実行環境を指定して出力
-v, -vv, -vvv, —verbose 出力メッセージを詳細にする。

-v, -vv, -vvv,を実行してみましたが、私が実行した環境では出力結果が変わりませんでした😢

出力の分類方法

Laravel Statsでは以下の条件で分類しています。

コンポーネント 条件
Controller ルーティングに登録されている。php artisan route:listに表示されるコントローラ
Model Illuminate\Database\Eloquent\Modelが継承されているファイル
Command Illuminate\Console\Commandが継承されているファイル
Rule Illuminate\Contracts\Validation\Ruleが継承されているファイル
Policy AuthServiceProviderに登録されているポリシー
Middleware App\Http\Kernelに登録されているミドルウェア
Event Illuminate\Foundation\Events\Dispatchableトレイトを使用しているファイル
Event Listener EventServiceProviderに登録されているファイル
Mail Illuminate\Mail\Mailableが継承されているファイル
Notification Illuminate\Notifications\Notificationが継承されているファイル
Nova Action Laravel\Nova\Actions\Actionが継承されているファイル
Nova Filter Laravel\Nova\Filters\Filterが継承されているファイル
Nova Lens Laravel\Nova\Lenses\Lensが継承されているファイル
Nova Resource Laravel\Nova\Resourceが継承されているファイル
Job Illuminate\Foundation\Bus\Dispatchableトレイトを使用しているファイル
Migration Illuminate\Database\Migrations\Migrationが継承されているファイル
Request Illuminate\Foundation\Http\FormRequestが継承されているファイル
Resource Illuminate\Http\Resources\Json\Resource, Illuminate\Http\Resources\Json\JsonResourceまたはIlluminate\Http\Resources\Json\ResourceCollectionが継承されているファイル
Seeder Illuminate\Database\Seederが継承されているファイル
ServiceProvider Illuminate\Support\ServiceProviderが継承されているファイル
Dusk Tests Laravel\Dusk\TestCaseが継承されているファイル
BrowserKit Test Laravel\BrowserKitTesting\TestCaseが継承されているファイル
PHPUnit Test PHPUnit\Framework\TestCaseが継承されているファイル

出力分類の追加

プロジェクト毎に作成しているファイルを分析対象にする場合は、Wnx\LaravelStats\Contracts\Classifierを実装したクラスを作成することで追加することができます。

例としてapp/Classifiers/RepositoryClassifier.phpを作成すると以下のようなファイルになります。

<?php

namespace App\Classifiers;

use Wnx\LaravelStats\ReflectionClass;
use Wnx\LaravelStats\Contracts\Classifier;

class RepositoryClassifier implements Classifier
{
    /**
     * 出力時のコンポーネント名
     */
    public function name(): string
    {
        $d = new DateTime();
        return 'Repositories';
    }

    /**
     * 出力対象とする条件
     */
    public function satisfies(ReflectionClass $class): bool
    {
        return $class->isSubclassOf(\App\Repositories\BaseRepository::class);
    }

    /**
     * Code LLoCに行数を含めるか
     */
    public function countsTowardsApplicationCode(): bool
    {
        return true;
    }

    /**
     * Test LLoCに行数を含めるか
     */
    public function countsTowardsTests(): bool
    {
        return true;
    }
}

作成したファイルをconfig/stats.phpcustom_component_classifierに追加することで出力対象が追加されます。

<?php
    ...
    'custom_component_classifier' => [
        \App\Classifiers\RepositoryClassifier::class
    ],
    ...

あとがき

このパッケージをインストールすることでファイルごとの行数やメソッド数、クラス数を分析することでどこが複雑になっているかを手軽に調べることができるようになると思います。

Laravel StatsとPHP Insightsを併せて利用することでよりプロジェクトのコード分析が捗ると思うので一度使用してみてはいかがでしょうか。

参考