Laravel8に静的解析であるLarastanを導入する方法

Laravel8にLarastanを導入する方法

Larasatanの導入方法

公式ドキュメントを翻訳して、インストール手順をまとめました。
さらに、わかりづらい箇所は補足を入れています。
公式よりもわかりやすい内容となっています。

目次

Larastanの導入方法

STEP
Larastanのインストール

Laravel8はversion1をインストールします。

9.xより古いバージョンのLaravelを使用している場合は、Larastanv1.xを参照してください。

Packagist:https://packagist.org/packages/nunomaduro/larastan
composer require nunomaduro/larastan:1.* --dev
STEP
次にアプリケーションのルートに、phpstan.neonまたはphpstan.neon.distを作成します。
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のドキュメントをご覧ください:

STEP
最後に、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

このコマンドを実行すると、phpstan-baseline.neonが生成され、これまでの内容は解析しません。
今後実装した内容のみ解析してくれるので、途中で導入する際は最適です。
画像の通り、ベースラインファイル生成以降のコードのみ解析してくれます

デメリットとしては、ベースライン対象のコードを削除・修正すると、ベースラインのコードが見つからないエラーを検知します。この検知をオフにするオプションがあるとは思いますが、まだ未確認です。
こういったこともあり、ベースラインの生成はなるべく避けたい。level0からエラー検知を無くしていくのが定石だと思われる。

コメントでエラーを無視する


特定のエラーを無視するには、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が理解するには魔法が強すぎます。無視する一般的なエラーをリストし、必要に応じて追加します

途中導入する場合

途中導入する場合は、いくつか気を付けることがあります

  1. エラー総数が多すぎるため、レベル0から導入する。優先度が高いエラーを改善して、徐々にレベルを上げていく。
  2. ベースラインファイルを生成する。途中導入するとエラー総数が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}で記載すると、問題なくクリアします。

あわせて読みたい
ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる