Laravelプロジェクトにphpstanを導入する
概要
laravelでがっつり仕事をすることになったので、静的解析としてphpstanを導入してみた記録
Find Bugs Without Writing Tests | PHPStan
laravelに導入する場合は非公式のLarastanというものがあるらしい(bladeはbladestanがあるらしいが今回はapiとしてだけ使ってるので)
インストール
composer require larastan/larastan:^2.0 --dev
設定ファイルのphpstan.neon
ファイルを作成
touch phpstan.neon
以下のような内容を記載
includes:
- vendor/larastan/larastan/extension.neon
parameters:
paths:
- app/
# Level 9 is the highest level
level: 5
# ignoreErrors:
# - '#PHPDoc tag @var#'
#
# excludePaths:
# - ./*/*/FileToBeExcluded.php
#
# checkMissingIterableValueType: false
これで以下のコマンドを実行するとapp/
以下のコードに対してphpstanが実行される
./vendor/bin/phpstan analyse --memory-limit=2G
レベルだけ変えて実行したい場合は--level
(-l
)オプションを指定することで設定ファイルのレベルを上書きして実行できる
./vendor/bin/phpstan analyse --memory-limit=2G -l 7
rule level
- 基本的なチェック。未知のクラス、関数呼び出しなどをエラーにする
- 未定義の変数、未定義のマジックメソッドのチェック
- 未知のメソッドをチェックしてphpdocsを検証する
- 返り値の型、プロパティに割り当てられた型のチェック
- 基本的なデッドコードのチェック。常にfalseのinstanceofや到達しないコードの検出
- メソッドや関数の引数に渡される型をチェック
- typehintsが書かれていないものをエラーに
- 部分的に間違ったunion typeの警告。union typeの一部にしかないメソッドなどを警告
- nullableなものに対しての警告
- mixedを厳格に
どのレベル感がいいのかXだったりブログだったりを見たところ、9にすると対応が大変みたいなので、アプリケーション組むのであれば8で良さそうだと思った
baseline
今後はlevel 8以上のコードを書いていこうという時に既存のコードが大量にエラーを吐いてしまうと、そのコードを対処市てからじゃないとlevel 8相当のコードをphpstanでチェックして書いていくということができないためbaselineという機能を使うと既存の部分に関しては一旦エラーを出さないようになり、level 8でコードを書いていくということが可能
使い方としてはphpstan analyse
実行時に--generate-baseline
オプションでbaselineを生成し、生成されたneon
ファイルをconfigファイルで読み込むようにする
github actions
phpstanをgithub actionsで実行する。php-actions/phpstan
を使えば簡単に実行できた
name: analytics
on:
pull_request:
workflow_dispatch:
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: php-actions/composer@v6
with:
php_version: 8.2
- uses: php-actions/phpstan@v3
with:
configuration: phpstan.neon
php_version: 8.2
level: 5
phpstan.neon
の設定値とは別でlevelを設定することで、ローカルではlevel 8で動かすがci上では5を満たしていればOKというような事ができる。既存部分は多少目を瞑るが新規作成部分などは高レベルの設定値でチェックできて便利
まとめ
phpでもphpdocをいい感じに設定するとより詳細にチェックしてくれるのでとても便利なことを知ったが、typescript脳なのでどうしても型推論して欲しいと思ってしまう。
どうもphpから逃れられないようなのでもっとゴリゴリに型情報書けるようになってmixed
絶許社会になって欲しい(level9が難しいみたいなので、できるものなんだろうか)