mcpField
L
laravel-quality

laravel-quality

github.com/leeoveryテスト・品質43116 回インストール31 週間前に更新
リポジトリ

laravel-quality について

Laravel プロジェクト向けの品質チェックガイドです。テスト、静的解析、コードスタイルを扱い、アーキテクチャテストとコミット前の確認を重視します。

主な機能

  1. 01Pest テストとカバレッジ確認
  2. 02アーキテクチャルールの自動テスト
  3. 03PHPStan 静的解析
  4. 04Laravel Pint による整形
  5. 05厳密な型宣言の要件

活用シーン

  1. 01Laravel アプリの品質チェックを整備
  2. 02コミット前にテストと解析を実行
  3. 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 の品質

テスト、静的解析、コード品質の徹底。

関連ガイド:

品質スタック

# 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 ではなくプリミティブ型を渡す
  • ドメインロジックを含むジョブ/リスナー
型安全性
  • 戻り値の型がない
  • パラメーターの型がない
  • プロパティの型がない
  • 型指定されていない配列/コレクション
テスト
  • エンドポイントのフィーチャーテストがない
  • アクションのユニットテストがない
  • 重要な処理経路のカバレッジが低い
  • 壊れやすいテスト(モックが多すぎる)

徹底するための方針

  1. アーキテクチャテスト - 自動チェック
  2. PR レビュー - 手動で確認
  3. CI/CD ゲート - ビルド失敗時にブロック
  4. チーム標準 - ドキュメント化とトレーニング
  5. ペアプログラミング - 知識を共有

コメント