Larasatanの導入方法
公式ドキュメントを翻訳して、インストール手順をまとめました。
さらに、わかりづらい箇所は補足を入れています。
公式よりもわかりやすい内容となっています。
Larastanの導入方法
Laravel8はversion1をインストールします。
9.xより古いバージョンのLaravelを使用している場合は、Larastanv1.xを参照してください。
Packagist:https://packagist.org/packages/nunomaduro/larastan
composer require nunomaduro/larastan:1.* --dev
includes:
- ./vendor/nunomaduro/larastan/extension.neon
parameters:
paths:
- app
# The level 9 is the highest level
level: 5
ignoreErrors:
- '#PHPDoc tag @var#'
excludePaths:
- ./*/*/FileToBeExcluded.php
checkMissingIterableValueType: false
利用可能なすべてのオプションについては、PHPStanのドキュメントをご覧ください:
./vendor/bin/phpstan analyse
Allowed memory size exhausted
エラーが発生した場合は、オプションを使用し--memory-limit
て問題を修正できます。
./vendor/bin/phpstan analyse --memory-limit=2G
エラーを無視する
ベースラインファイルの生成
古いコードベースでは、高いPHPStanレベルを渡すためにすべてのコードを修正するのに時間を費やすのは難しいかもしれません。
これを回避するために、ベースラインファイルを生成できます。ベースラインファイルは、現在のすべてのエラーを含む構成ファイルを作成するため、古いコードよりも高い標準に従って新しいコードを記述できます。(PHPStan Docs)
./vendor/bin/phpstan analyse --generate-baseline
コメントでエラーを無視する
特定のエラーを無視するには、phpコメントまたは構成ファイルを使用します。
// @phpstan-ignore-next-line
:次の行のエラーを検出しない// @phpstan-ignore-line
:この行のエラーを検出しない
// @phpstan-ignore-next-line // 次の行を無視する
$test->badMethod();
$test->badMethod(); // @phpstan-ignore-line この行を無視する。
なるべく使いたくないですが、どうしても必要な際に利用します
設定ファイルで無視したいエラーメッセージを指定する。
PHPStanの設定ファイルでエラーを無視する場合、エラーメッセージを元に正規表現を記述して無視します。
parameters:
ignoreErrors:
- '#Call to an undefined method .*badMethod\(\)#'
コードの方針が異なる場合やcomposerなどのパッケージに関するエラーに利用します。
コードジャンプできないような特殊なメソッドなどに用意ます。
Laravelであるものはlarastanがデフォルトエラー検知しないですが、追加でインストールしたパッケージは個別で設定する必要があります。
他にもphpstanのバグに対応する際などに利用します。
プロパティの未定義エラーを無視
下記のようにプロパティを定義している場合、Access to an undefined property
のエラーが検出されます。
class EnterpriseResource extends JsonResource
{
public string $enterprise;
public string $description;
public string $contact;
これを改善するには@property
を利用して定義します。
/**
* @property string $enterprise
* @property string $description
* @property string $contact
*/
class EnterpriseResource extends JsonResource
{
public string $enterprise;
public string $description;
public string $contact;
@property
を定義しないプロジェクトもあるかと思います。その際は下記を追加してエラーを無視します。
parameters:
ignoreErrors:
- '#Access to an undefined property [a-zA-Z0-9\\_]+::\$[A-Za-z0-9\\_]#'
reportUnmatchedIgnoredErrors
reportUnmatchedIgnoredErrorsを利用して、構成やPHPDoc関連のエラーをすべて無視する場合、下記の設定をします。
parameters:
reportUnmatchedIgnoredErrors: false
これだと無視の対象が広すぎる印象です。必要なエラーも無視してしまうので、やはり正規表現で記述するしかなさそうです。
ルール
Laravelに固有の構成可能なルールのリストはここにあります。
カスタムPHPDocタイプ
Larastanに固有のPHPDocタイプのリストは、ここにあります。
カスタムPHPStan構成パラメーター
PHPStan構成ファイルで使用できるカスタム構成パラメーターのリストは、ここにあります。
無視するエラー
Laravelの一部は現在、Larastan/PHPStanが理解するには魔法が強すぎます。無視する一般的なエラーをリストし、必要に応じて追加します
途中導入する場合
途中導入する場合は、いくつか気を付けることがあります
- エラー総数が多すぎるため、レベル0から導入する。優先度が高いエラーを改善して、徐々にレベルを上げていく。
- ベースラインファイルを生成する。途中導入するとエラー総数が200以上あり、変更箇所が多すぎます。そうすると再テストが大変です。致命的なエラーでなければ、ベースラインファイルを生成して、今後のコードのみ解析する方針をしましょう。
見落としやすい箇所
@inheritDocがエラー対象になる。
/**
* @inheritDoc
*/
public function get($value)
{
return json_decode($value);
}
するとエラーが表示されます
PHPDoc tag @param has invalid value ($value): Unexpected token "$value", expected type at offset 61
そのため対応されていないのか?と思いましたが、しっかり対応されていました。
/**
* {@inheritDoc}
*/
public function get($value)
{
return json_decode($value);
}
{@inheritDoc}
で記載すると、問題なくクリアします。
コメント