blog.yuzu441.com

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

Rule Levels | PHPStan

  1. 基本的なチェック。未知のクラス、関数呼び出しなどをエラーにする
  2. 未定義の変数、未定義のマジックメソッドのチェック
  3. 未知のメソッドをチェックしてphpdocsを検証する
  4. 返り値の型、プロパティに割り当てられた型のチェック
  5. 基本的なデッドコードのチェック。常にfalseのinstanceofや到達しないコードの検出
  6. メソッドや関数の引数に渡される型をチェック
  7. typehintsが書かれていないものをエラーに
  8. 部分的に間違ったunion typeの警告。union typeの一部にしかないメソッドなどを警告
  9. nullableなものに対しての警告
  10. mixedを厳格に

どのレベル感がいいのかXだったりブログだったりを見たところ、9にすると対応が大変みたいなので、アプリケーション組むのであれば8で良さそうだと思った

baseline

今後はlevel 8以上のコードを書いていこうという時に既存のコードが大量にエラーを吐いてしまうと、そのコードを対処市てからじゃないとlevel 8相当のコードをphpstanでチェックして書いていくということができないためbaselineという機能を使うと既存の部分に関しては一旦エラーを出さないようになり、level 8でコードを書いていくということが可能

The Baseline | PHPStan

使い方としては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が難しいみたいなので、できるものなんだろうか)

参考

tags: php