プロジェクトが大規模になるにつれて、コードの複雑性や保守性の向上が課題となります。このような課題に対処する手段として、いろいろなツールがあると思いますが、今回はPHPStanをプロジェクトに組み込むことで、コードの品質向上させたいと思います。
PHPStanの導入
PHPStanをプロジェクトに導入するために、まずComposerを使用して必要なパッケージをインストールします。
composer require --dev phpstan/phpstan
場合によっては下記のエラーが出るかもしれません。
Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump> @php artisan package:discover –ansi
In PackageManifest.php line 122: Undefined index: name
このエラーはcomposer v2を使用している場合に発生するようです。
なので、一旦composerのバージョンを下げることで解決できます。
composer self-update --1
インストールが完了したら、プロジェクトのルートディレクトリに .phpstan.neon という設定ファイルを作成します。このファイルには、PHPStanの静的解析のレベル設定や解析対象となるディレクトリを指定します。
parameters:
level: 8
paths: src/Eccube/
excludePaths: src/Eccube/Command/GeneratorCommand/*
これで準備が整ったので、一度PHPStanを実行してみましょう!
vendor/bin/phpstan analyze
すると、大量にエラーが…!
PHPDoc tag @param has invalid value \\(\\$value\\)\\: Unexpected token \”\\$value\”, expected type at offset 102$PHPDoc tag @param has invalid value \\(\\$value\\)\\: Unexpected token \”\\$value\”, expected type at offset 18PHPDoc tag @param has invalid value \\(\\$value\\)\\: Unexpected token \”\\$value\”, expected type at offset 57Parameter \\#1 \\$str of function trim expects string, string\\|null given\\.
8000件くらいエラーが出てしまいました。。既存のプロジェクトに途中から導入しているので仕方ないですね。
こういう時のために、PHPStanでbaselineというものを作成できます。baselineに含めたエラーは一旦無視できます。
vendor/bin/phpstan analyze --generate-baseline
`phpstan-baseline.neon`が自動生成されますので、こちら`phpstan.neon`に記載し読み込んでもらいましょう。
phpstan.neon
includes:
- phpstan-baseline.neon
parameters:
level: 8
paths: src/Eccube/
excludePaths: src/Eccube/Command/GeneratorCommand/*
これで大量のエラーは一旦無視できました!
型注釈の追加
エンティティやそれに関連するメソッドに型注釈を追加します。これにより、PHPStanはコードの型整合性を確認しやすくなります。
// src/Entity/YourEntity.php
class YourEntity
{
/**
* @var string
*/
private $name;
// ...
/**
* @param string
* @return string
** /
public function test(string $message)
{
return message;
}
}
いかがでしたでしょうか?
PHPStanはコードの静的解析を行い、型の整合性や潜在的な問題を見つけてくれます。これにより、コードの品質向上や開発プロセスの効率化が期待できます。
PHPStanを導入することで、より安全で信頼性の高いコードを構築することができます。是非一度試してみて、プロジェクトのメンテナンス性や開発速度の向上を実感してください。