CodeIgniter DevKit で PHPStan を使い静的解析する

この記事は CodeIgniter Advent Calendar 2022 - Qiita の21日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter DevKit で Rector を使いコーディングスタイルを修正する」 の続きです。

PHPStanとは?

PHPStanはPHPの静的解析ツールです。

PHPStanの設定

DevKitをインストールすれば、PHPStanはインストール済みです。

DevKitのインストールについては 「CodeIgniter DevKit で php-cs-fixer を使いコーディングスタイルを修正する」 を参照してください。

vendor/codeigniter4/devkit/src/Template/phpstan.neon.dist をプロジェクトルートにコピーします。

そして、コピーした phpstan.neon.dist をプロジェクトに合わせて調整します。

parameters:
    tmpDir: build/phpstan
    level: 5
    paths:
        - app/
        - tests/
    bootstrapFiles:
        - vendor/codeigniter4/framework/system/Test/bootstrap.php
    excludePaths:
        - app/Config/Routes.php
        - app/Views/*
    ignoreErrors:
    universalObjectCratesClasses:
        - CodeIgniter\Entity
        - CodeIgniter\Entity\Entity
        - Faker\Generator
    scanDirectories:
        - vendor/codeigniter4/framework/system/Helpers
    dynamicConstantNames:
        - APP_NAMESPACE
        - CI_DEBUG
        - ENVIRONMENT

ここでは、特に変更せずそのままです。

なお、パスの設定が正しいかは必ず確認してください。DevKitのテンプレートのパスはCodeIgniter4のアプリのパスに設定されているため、ライブラリの場合は少し修正が必要です。

composer.json の設定

実行するためのコマンドを composer.json に追加します。

--- a/composer.json
+++ b/composer.json
@@ -27,7 +27,11 @@
],
"cs": "php-cs-fixer fix --ansi --verbose --dry-run --diff",
"cs-fix": "php-cs-fixer fix --ansi --verbose --diff --using-cache=yes",
-       "style": "@cs-fix"
+       "style": "@cs-fix",
+       "analyze": [
+           "bash -c \"XDEBUG_MODE=off phpstan analyse\""
+       ],
+       "sa": "@analyze"
  },
  "support": {
  "forum": "http://forum.codeigniter.com/",

これで、composer sa でPHPStanが実行されます。

PHPStanの実行

それではPHPStanを実行してみましょう。

$ composer sa
> bash -c "XDEBUG_MODE=off phpstan analyse"
Note: Using configuration file /.../codeigniter4login/phpstan.neon.dist.
 56/56 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 ------ --------------------------------------------------------------------------------------- 
  Line   app/Controllers/Users.php                                                              
 ------ --------------------------------------------------------------------------------------- 
  16     Call to deprecated method getMethod() of class CodeIgniter\HTTP\Request:               
         The $upper functionality will be removed and this will revert to its PSR-7 equivalent  
  68     Call to deprecated method getMethod() of class CodeIgniter\HTTP\Request:               
         The $upper functionality will be removed and this will revert to its PSR-7 equivalent  
  108    Call to deprecated method getMethod() of class CodeIgniter\HTTP\Request:               
         The $upper functionality will be removed and this will revert to its PSR-7 equivalent  
 ------ --------------------------------------------------------------------------------------- 



 [ERROR] Found 3 errors                                                                                                 


Script bash -c "XDEBUG_MODE=off phpstan analyse" handling the analyze event returned with error code 1
Script @analyze was called via sa

エラーが報告されました。

Request::getMethod() の引数 $upper の廃止予定に関する警告です。

PHPStan設定の調整

Call to deprecated method getMethod() of class CodeIgniter\HTTP\Request: The $upper functionality will be removed and this will revert to its PSR-7 equivalent

このエラーはフレームワークのPHPDocコメントが原因なので、 アプリのコードの問題ではありません。ユーザーが修正することはできません。

そこでエラーを抑制します。

ベースラインの作成

ベースラインを作成しましょう。

$ vendor/bin/phpstan --generate-baseline
 ! [NOTE] The Xdebug PHP extension is active, but "--xdebug" is not used. This may slow down performance and the process
 !        will not halt at breakpoints.                                                                                 

Note: Using configuration file /.../codeigniter4login/phpstan.neon.dist.
 56/56 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%



 [OK] Baseline generated with 3 errors.

これで、以下の phpstan-baseline.neon が作成されました。

parameters:
    ignoreErrors:
        -
            message: """
                #^Call to deprecated method getMethod\\(\\) of class CodeIgniter\\\\HTTP\\\\Request\\:
                The \\$upper functionality will be removed and this will revert to its PSR\\-7 equivalent$#
            """
            count: 3
            path: app/Controllers/Users.php

しかし、このエラーは Request::getMethod() を使うたびに発生します。

そこで、以下のように回数を削除して、パスを変更します。

parameters:
    ignoreErrors:
        -
            message: """
                #^Call to deprecated method getMethod\\(\\) of class CodeIgniter\\\\HTTP\\\\Request\\:
                The \\$upper functionality will be removed and this will revert to its PSR\\-7 equivalent$#
            """
            path: app/Controllers/*.php

次にベースラインを使うようにメインの設定ファイルを変更します。

--- a/phpstan.neon.dist
+++ b/phpstan.neon.dist
@@ -1,3 +1,5 @@
+includes:
+   - phpstan-baseline.neon
 parameters:
    tmpDir: build/phpstan
    level: 5

これで、ベースラインが使われるようになりました。

再度、実行してエラーが出ないことを確認しましょう。

$ composer sa
> bash -c "XDEBUG_MODE=off phpstan analyse"
Note: Using configuration file /.../codeigniter4login/phpstan.neon.dist.
 56/56 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%



 [OK] No errors

設定が完了し、問題がなければ、Gitでcommitしてください。

まとめ

  • CodeIgniter DevKit はCodeIgniterのライブラリとプロジェクトのための開発用のツールキットです。
  • DevKitにはPHPStanが含まれており、簡単に静的解析を実行できます。

CodeIgniter DevKit で Psalm を使い静的解析する」 へ続く。

この記事は CodeIgniter Advent Calendar 2022 - Qiita の21日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

関連

参考

Date: 2022/12/21

Tags: codeigniter, codeigniter4, phpstan