|  Download Yii2 Code Statistic    
 
 Based on phploc/phploc InstallationEither run composer require --dev insolita/yii2-codestat:~2.0
 or add "insolita/yii2-codestat": "~2.0"
 in require-dev section of your composer.jsonfile. Basic UsageAdd in console configuration file, in section modules php
'modules'=>[
 ....
        'codestat'=>[
            'class'=>\insolita\codestat\CodeStatModule::class,
            'scanTargets' => ['@backend/','@common/','@frontend/','@console/'],
            'exceptTargets' => ['config','vendor','web/','runtime/','views/','*tests/'],
        ]
    ],
  scanTargets   - array of path, or path aliases that will be scanned recursively
 exceptTargets - array of path patterns for excluding For checking whole list of files that will be processed, run ./yii codestat/default/list-files
 For statistic summary output run ./yii codestat
 For statistic summary output with show bad resolved files ./yii codestat 1
 Show full phploc report per each defined group ./yii codestat/default/advanced 
./yii codestat/default/advanced WebControllers
./yii codestat/default/advanced WebControllers,RestControllers,ConsoleControllers
 Show full phploc report for all matched files ./yii codestat/default/common
 Show full phploc report for custom directory ./yii codestat/default/directory @common/models
 Show full phploc report for custom file ./yii codestat/default/file @common/lib/MySuperClass.php
 List available metrics with codes ./yii codestat/default/list-metrics
 Advanced UsageCustom Class Grouping RulesYou can extend or overwrite property 'groupRules', with supported formats 'Group Name' => 'BaseParentClass'
  where 'BaseParentClass' should by verified with (\ReflectionClass)->isSubclassOf() or 'Group Name' => function(\ReflectionClass $reflection){
       //Should return true if class valid for this group, otherwise false;
  }
 Final example php
'modules'=>[
 ....
        'codestat'=>[
            'class'=>\insolita\codestat\CodeStatModule::class,
             'groupRules' => [
                                'Jobs' => 'yii\queue\JobInterface',
                                'Handlers' => 'trntv\bus\interfaces\Handler::class',
                                'DTO' => function (\ReflectionClass $reflection) {
                                     return mb_strpos($reflection->getFileName(), 'Dto')!==false;
                                },
                                'All Tests' => function (\ReflectionClass $reflection) {
                                    return $reflection->isSubclassOf('\Codeception\Test\Unit')
                                        || StringHelper::endsWith($reflection->getName(), 'Cest');
                                },
                            ] + CodeStatModule::defaultRules(),
                    ],
        ]
    ],
 Important! The order of the rules in the list matters, the base classes (\yii\base\Component and \yii\base\Object) should be at the end of the list! Custom code metricsCode metrics provided by https://github.com/sebastianbergmann/phploc,  has lot of variants, you can define own combination For actions advanced/common/directory/file you should set metrics property with array of necessary metric names php
'modules'=>[
 ....
        'codestat'=>[
            'class'=>\insolita\codestat\CodeStatModule::class,
            'metrics'=>['loc','lloc','classCcnAvg', 'classLlocAvg', 'methodCcnAvg']
            ]
 ]
 For summary action you should provide property 'analyseCallback' in module like as     'analyseCallback = function($group){
               /@var insolita\codestat\lib\collection\Group $group/
               $metrics=$customAnalyzer->analyze($group->getFiles());
               return ['totalFiles'=>count($group->getFiles()),  'metric1'=>$metrics[some], ...etc];
     }
 It should return associative array with 'metric name' => 'metric value'data and will replace internal https://github
.com/Insolita/yii2-codestat/blob/7d0fc3351718b2052624ea091ff8f154fe471aeb/src/lib/CodestatService.php#L154 And also table summary convention - if metric name contains slash "/", for summary row will be counted average value, otherwise sum |