laravel:debugging-prompts について
Laravel の AI デバッグ向けプロンプト作成スキルです。エラー、期待値と実際の結果、ログ、状態、試した対処法を示し、エージェントに具体的な診断情報を提供する方法を扱います。
主な機能
- 01エラーとスタックトレースの詳細テンプレート
- 02期待値と実際の結果の例
- 03ログと状態の共有ガイド
- 04仮説と根拠の整理方法
- 05一般的なデバッグ問題のテンプレート
活用シーン
- 01データベースエラー報告の作成
- 02API 応答の不具合の説明
- 03キュー障害とジョブ状態の共有
- 04試したパフォーマンス改善策の記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jpcaparas/ superpowers-laravel --skill laravel:debugging-promptsインストール後、Claude Code で/laravel:debugging-promptsを入力して読み込まれたか確認します。
詳細
デバッグ用プロンプト
AI を使ったデバッグには、完全な情報が必要です。コンテキストが不足していると、具体的な問題を解決できない一般的な提案になってしまいます。
エラーメッセージとスタックトレース
不完全
「決済コントローラーでエラーが発生します」
完全
「決済の処理中にエラーが発生します。
エラー:
Illuminate\Database\QueryException: SQLSTATE[23000]:
Integrity constraint violation: 1452 Cannot add or update a child row:
a foreign key constraint fails (`app`.`payments`, CONSTRAINT `payments_order_id_foreign`
FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE)
スタックトレース:
#0 app/Services/PaymentService.php(45): Payment::create()
#1 app/Http/Controllers/PaymentController.php(28): PaymentService->process()
#2 vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54)
コンテキスト:
- Laravel 13.x、MySQL 8.0
order_idがordersテーブルに存在しない場合に発生します- 決済データ:
['order_id' => 999, 'amount' => 5000, 'status' => 'pending'] - 注文 999 はデータベースに存在しません」
効果がある理由: エラー、スタックトレース、コンテキスト、問題の原因となる具体的なデータが揃っています。
期待される動作と実際の動作
曖昧
「API が正しいデータを返しません」
具体的
「Product API が正しくないデータを返します。
期待される動作:
{
"data": {
"id": 1,
"name": "Widget",
"price": "29.99",
"category": {
"id": 5,
"name": "Tools"
}
}
}
実際の動作:
{
"data": {
"id": 1,
"name": "Widget",
"price": 2999,
"category": null
}
}
問題点:
- 価格が書式設定されたドル表記("29.99")ではなく、セント単位(2999)です
- 商品に
category_id = 5があるにもかかわらず、カテゴリが null です
コード:
// ProductController@show
return new ProductResource($product);
データベースでは商品に category_id = 5 が設定されていますが、リレーションが読み込まれません。」
効果がある理由: 期待値と実際の出力を正確に示し、具体的な問題点を特定して、関連するコードも含めています。
ログエントリーと状態
不十分
「キューに問題があるようです」
十分
「キュー内のジョブが失敗します。
ログエントリー:
[2024-01-15 10:30:15] local.ERROR: Job failed: ProcessOrderJob
{"order_id":123,"exception":"Stripe\\Exception\\InvalidRequestException:
No such customer: cus_invalid","attempts":3}
[2024-01-15 10:30:15] local.INFO: Order state before job
{"id":123,"status":"pending","stripe_customer_id":"cus_invalid"}
ジョブコード:
public function handle()
{
$customer = $this->stripe->customers->retrieve(
$this->order->stripe_customer_id
);
// ...
}
状態:
- 注文 123 の
stripe_customer_id = "cus_invalid" - Stripe に顧客が存在しません
- ジョブは 3 回リトライされ、現在は
failed_jobsテーブルにあります - Laravel 13.x と Horizon を使用しています」
効果がある理由: ログ、状態に関する情報、関連するコード、リトライに関するコンテキストが含まれています。
仮説と根拠
弱い
「キャッシュの問題だと思います」
強い
「Redis キャッシュが古くなっていると思われます。
仮説: 商品価格がキャッシュされているものの、更新時にキャッシュが無効化されていません。
根拠:
- データベースの商品価格を更新しました:
UPDATE products SET price = 3999 WHERE id = 1 - データベースの表示:
SELECT price FROM products WHERE id = 1→3999 - API は古い価格を返します:
GET /api/products/1→"price": "29.99" php artisan cache:clearの実行後、API は正しい価格を返します:"price": "39.99"
キャッシュのコード:
public function show(Product $product)
{
$cached = Cache::remember("product.{$product->id}", 3600, function () use ($product) {
return new ProductResource($product);
});
return $cached;
}
問題: 商品の更新時にキャッシュキーが無効化されません。ProductObserver でキャッシュを無効化するか、show メソッドからキャッシュ処理を削除する必要があります。」
効果がある理由: 明確な仮説、具体的な根拠、関連するコード、解決策の提案が含まれています。
試した解決策
役に立たない
「いくつか試しましたが、何も解決しませんでした」
役に立つ
「試した解決策と結果:
試行 1: Eager Loading を追加しました
$products = Product::with('category')->get();
結果: N+1 クエリが引き続き発生します。Debugbar では 101 件のクエリ(商品に 1 件、カテゴリに 100 件)が表示されます。
試行 2: データ取得後に load() を使用しました
$products = Product::all();
$products->load('category');
結果: 同じ問題が発生し、引き続き 101 件のクエリが実行されます。
試行 3: リレーションの定義を確認しました
// In Product model
public function category()
{
return $this->belongsTo(Category::class);
}
結果: リレーションは正しく見えます。外部キー category_id は products テーブルに存在します。
現在の状態: Eager Loading の構文は正しいようですが、機能しません。Laravel 13.x を使用しています。何が不足していますか?」
効果がある理由: 試した内容、実際に使用したコード、確認された結果を示すことで、すでに試した解決策が再度提案されるのを防げます。
デバッグ用テンプレート
テンプレート:エラーレポート
**Error:** [Full error message]
**Stack trace:** [Complete stack trace]
**File/Line:** [Where error occurs]
**Context:** [Laravel version, packages, environment]
**Data:** [Input data causing error]
**Expected:** [What should happen]
テンプレート:予期しない動作
**Expected:** [Describe expected behavior with example]
**Actual:** [Describe actual behavior with example]
**Code:** [Relevant code snippet]
**State:** [Database state, variable values]
**Environment:** [Laravel version, Sail/host, packages]
テンプレート:パフォーマンスの問題
**Problem:** [Describe slow operation]
**Metrics:** [Response time, query count, memory usage]
**Query log:** [Slow queries from Debugbar/Telescope]
**Code:** [Code causing performance issue]
**Dataset size:** [Number of records involved]
**Attempted:** [Optimizations already tried]
クイックリファレンス
AI を使って効果的にデバッグする方法:
- エラーを完全に示す - メッセージ全文、スタックトレース、ファイルと行番号
- 両方を示す - 期待される動作と実際の動作
- ログを含める - エラーログ、情報ログ、状態のダンプ
- 根拠を共有する - データベースクエリ、API レスポンス、変数のダンプ
- 試した内容を記録する - 試したこと、実際のコード、結果
- コンテキストを提示する - Laravel のバージョン、環境、パッケージ
情報が多いほど、解決が早くなります。デバッグでは、できる限り詳しく伝えましょう。