Laravel
のプロジェクトにおいて、静的解析ツールlarastan
をVSCode
で使えるようにしたので、その備忘録です。
以下環境で実施しました。
PHP : 8.2.9
Laravel : 10.20.0
VSCode : 1.81.1
# WSL
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
Ubuntu 20.04.6 LTS
拡張機能PHPStan
をインストールする
拡張機能を「PHPStan
」で検索すると複数ヒットするのですが、今回は以下の拡張機能をインストールしました。
以下の理由でこちらの拡張機能を選定しました。
- インストール数は類似拡張機能の中で最多ではないが、引けを取らない数字である
- 最終更新日が唯一年内(2023年8月末現在)であった
- ファイル単位で解析できる
- 他の拡張機能だと「指定ディレクトリ以下全て」に対してしか行えないものもあるため
バージョン 3.0以降(2024年4月~)
単一ファイルのチェックではなく、常にリポジトリ全体のチェックを行うようになっています。設定で単一ファイルチェックにすることも可能ですが、キャッシュを破壊するため推奨しないとしています。
phpstan.neon
を配置する
PHPStan
の設定ファイルphpstan.neon
をディレクトリ直下に配置します。
※ディレクトリ直下以外に配置する場合は、拡張機能の設定からパスの修正が必要です
ひとまずPHPStan
のレベル(今回は最大レベル)と、チェック対象パスを指定します。
parameters:
level: 9
paths:
- app
larastan
のインストール
以下コマンドからプロジェクトにlarastan
をインストールします。
composer require nunomaduro/larastan:^2.0 --dev
larastan
のバージョンについて
larastan
のバージョン2.0.0
以上を使用するには
-
PHP 8.0+
, -
Laravel 9.0+
が必要です。
それ未満のPHP/Laravel
バージョンの場合は上記コマンドではエラーとなります。
その場合は、^2.0
を^1.9
に置き換えるなどで実行してください。
larastan
をインストールすると、PHPStan
も含まれています。
そのため、この時点で静的解析(larastan
的には「コード解析」という言葉を用いるそう)ができると思います。
任意のphp
ファイルを開き、Ctrl
+ Shift
+ p
でコマンドパレットを開きます。
PHPStan: Scan current file for errors
を選ぶことでも静的解析を実行できます。
PHPStan
も静的解析ツールなのですから、それだけがあれば良いような気もします。
ただ、現状larastan
の設定がないままPHPStan
だけを使うと、以下ではUser::create()
やredirect()->action()
などがCall to an undefined (static) method ...
という解析結果になってしまいます
larastan
を利用するための設定を追加する
phpstan.neon
にlarastan
の設定を追加することで、Laravel
用の解析を実行することができます。
# larastanを使用する
includes:
- ./vendor/nunomaduro/larastan/extension.neon
parameters:
level: 9
上記includes
を追加することで、先程のCall to an undefined (static) method ...
というエラーがなくなります
larastan
に怒られないようにコードを書きたい!と意気込みながら生きています。
(でもlevelをmaxに設定すると結構大変なので、levelを1つ1つ上げていきながら解消するのがいいのかなと思ったり)
余談ですが、
- プロジェクトの
composer.json
に記載のPHPバージョン - ローカルのPHPのバージョン
が合っていない場合はエラーで動かないのでお気をつけください!
# composer.jsonには">= 8.1.0"という指定なのに、ローカルのPHPバージョンが7.4.33で怒られる
PHPStan process exited with error filteredErr=PHP Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.4.33.
プロジェクトごとにPHPのバージョンが違うこともあります。
そのため、私は以下を参考にして、適宜切り替えられるようにしています。