laravel-quality について
Laravel プロジェクト向けの品質チェックガイドです。テスト、静的解析、コードスタイルを扱い、アーキテクチャテストとコミット前の確認を重視します。
主な機能
- 01Pest テストとカバレッジ確認
- 02アーキテクチャルールの自動テスト
- 03PHPStan 静的解析
- 04Laravel Pint による整形
- 05厳密な型宣言の要件
活用シーン
- 01Laravel アプリの品質チェックを整備
- 02コミット前にテストと解析を実行
- 03アーキテクチャテストで規約を確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ leeovery/ claude-laravel --skill laravel-qualityインストール後、Claude Code で/laravel-qualityを入力して読み込まれたか確認します。
同梱ファイルreferences/code-style.mdreferences/type-safety.md
詳細
Laravel の品質
テスト、静的解析、コード品質の徹底。
関連ガイド:
- code-style.md - Laravel Pint の設定とコーディングスタイル
- type-safety.md - 厳密な型と型ヒント
- テスト - 包括的なテストガイド
品質スタック
# composer.json scripts
{
"test": "pest",
"analyse": "phpstan analyse",
"format": "pint",
"quality": [
"@analyse",
"@test"
]
}
すべてのファイルの先頭に declare(strict_types=1) を記述する必要があります。コミットの前には必ず品質チェックを実行してください。
アーキテクチャテスト(Pest)
セットアップ
tests/Pest.php
pest()->extend(Tests\TestCase::class)->in('Feature', 'Unit');
アーキテクチャの基本テスト
tests/Architecture/ActionsTest.php
<?php
declare(strict_types=1);
arch('actions are invokable')
->expect('App\Actions')
->toHaveMethod('__invoke');
arch('actions live in Actions namespace')
->expect('App\Actions')
->toBeClasses()
->toOnlyBeUsedIn('App\Actions', 'App\Http', 'App\Jobs', 'App\Listeners');
arch('actions do not use models directly')
->expect('App\Actions')
->not->toUse('Illuminate\Database\Eloquent\Model');
tests/Architecture/DataTest.php
<?php
declare(strict_types=1);
arch('data objects extend base Data class')
->expect('App\Data')
->toExtend('App\Data\Data')
->ignoring('App\Data\Data');
arch('data objects use constructor property promotion')
->expect('App\Data')
->toHaveConstructor();
tests/Architecture/StrictTypesTest.php
<?php
declare(strict_types=1);
arch('app files declare strict types')
->expect('App')
->toUseStrictTypes();
arch('test files declare strict types')
->expect('Tests')
->toUseStrictTypes();
tests/Architecture/ControllersTest.php
<?php
declare(strict_types=1);
arch('controllers do not use DB facade')
->expect('App\Http')
->not->toUse('Illuminate\Support\Facades\DB');
arch('controllers do not use models directly')
->expect('App\Http\Web\Controllers')
->not->toUse('App\Models');
tests/Architecture/NamingTest.php
<?php
declare(strict_types=1);
arch('actions end with Action suffix')
->expect('App\Actions')
->toHaveSuffix('Action');
arch('data objects end with Data suffix')
->expect('App\Data')
->toHaveSuffix('Data')
->ignoring('App\Data\Data', 'App\Data\Concerns');
arch('exceptions end with Exception suffix')
->expect('App\Exceptions')
->toHaveSuffix('Exception')
->ignoring('App\Exceptions\Concerns');
tests/Architecture/ModelsTest.php
<?php
declare(strict_types=1);
arch('models use custom query builders')
->expect('App\Models')
->toHaveMethod('newEloquentBuilder');
arch('models do not use local scopes')
->expect('App\Models')
->not->toHaveMethod('scope*');
静的解析(PHPStan)
インストール
composer require phpstan/phpstan --dev
composer require phpstan/phpstan-strict-rules --dev
composer require larastan/larastan --dev
設定
phpstan.neon
includes:
- vendor/larastan/larastan/extension.neon
- vendor/phpstan/phpstan-strict-rules/rules.neon
parameters:
level: 8
paths:
- app
- tests
excludePaths:
- app/Providers/TelescopeServiceProvider.php
checkMissingIterableValueType: true
checkGenericClassInNonGenericObjectType: true
reportUnmatchedIgnoredErrors: false
実行
./vendor/bin/phpstan analyse
コードスタイル(Laravel Pint)
インストール
composer require laravel/pint --dev
設定
pint.json
{
"preset": "laravel",
"rules": {
"simplified_null_return": true,
"no_unused_imports": true,
"ordered_imports": {
"sort_algorithm": "alpha"
}
}
}
実行
./vendor/bin/pint
./vendor/bin/pint --test # Check only
テストカバレッジ
カバレッジを有効にする(Pest)
phpunit.xml
<coverage>
<report>
<html outputDirectory="coverage"/>
<text outputFile="php://stdout"/>
</report>
</coverage>
カバレッジ付きで実行
./vendor/bin/pest --coverage
./vendor/bin/pest --coverage --min=80 # Enforce minimum
CI/CD チェック
GitHub Actions の例
.github/workflows/tests.yml
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite
coverage: xdebug
- name: Install Dependencies
run: composer install --prefer-dist --no-interaction
- name: Code Style
run: ./vendor/bin/pint --test
- name: Static Analysis
run: ./vendor/bin/phpstan analyse
- name: Run Tests
run: ./vendor/bin/pest --coverage --min=80
コミット前フック
インストール
composer require brainmaestro/composer-git-hooks --dev
設定
composer.json
{
"extra": {
"hooks": {
"pre-commit": [
"./vendor/bin/pint",
"./vendor/bin/phpstan analyse",
"./vendor/bin/pest"
]
}
},
"scripts": {
"post-install-cmd": "vendor/bin/cghooks add --ignore-lock",
"post-update-cmd": "vendor/bin/cghooks update"
}
}
品質指標
追跡する項目
- テストカバレッジ - 80%以上を目指します
- PHPStan レベル - レベル 8(最大)
- アーキテクチャテスト合格率 - 100%
- コードスタイル違反 - 0 件
定期レビュー
- 毎週 - テストカバレッジの推移を確認します
- PR ごと - すべての品質チェックを実行します
- 毎月 - アーキテクチャへの準拠を確認します
- リリース時 - 品質を全面的に監査します
注意すべき一般的な問題
アンチパターン
- コントローラー内のドメインロジック
- ビルダーではなくスコープを使用する
- 厳密な型の宣言がない
- DTO ではなくプリミティブ型を渡す
- ドメインロジックを含むジョブ/リスナー
型安全性
- 戻り値の型がない
- パラメーターの型がない
- プロパティの型がない
- 型指定されていない配列/コレクション
テスト
- エンドポイントのフィーチャーテストがない
- アクションのユニットテストがない
- 重要な処理経路のカバレッジが低い
- 壊れやすいテスト(モックが多すぎる)
徹底するための方針
- アーキテクチャテスト - 自動チェック
- PR レビュー - 手動で確認
- CI/CD ゲート - ビルド失敗時にブロック
- チーム標準 - ドキュメント化とトレーニング
- ペアプログラミング - 知識を共有
コメント
Markdown 対応