Laravelでトランザクション処理のエラーハンドリングを行う方法
2022-03-29
2022-03-29
4 min read
Laravel
まずトランザクション処理
とは、複数のデータ更新を行う際に、データの整合性を保証するための処理です。
システム開発において、トランザクション処理は頻繁に出てくる処理だと思います。
LaravelではDB
ファサードが提供するメソッドを使用することで、簡単に実装することができます。
Laravelでトランザクションを行う方法は、以下の2つのパターンがあります。
DB
ファサードが提供するtransaction
メソッドを使用する方法DB
ファサードが提供するbeginTransaction
メソッドを使用する方法
※beginTransaction
メソッドを用いた場合は、トランザクションの開始やロールバックやコミットいった動きを自分で制御する必要があります。
今回はtransaction
メソッドを使用する方法で、エラーハンドリングの処理を記述します。
以下transactionメソッドを用いた簡単な例です。
try{
$user = DB::transaction(function () use () {
// =====================
// 登録や更新などの複数の処理
// =====================
// エラーにしたいは例外を投げる
if($someCondition) throw new Exception('1000');
// 戻り値にユーザーを返す
$result = User::first();
return $result;
});
return response()->json(['data' => $user], 200);
} catch(Throwable $e){
// 例外で投げられたメッセージを受け取って返す
$error_code = $e->getMessage();
$error_message = $error_code === '1000' ? '登録更新処理に失敗しました。' : '不明なエラーです。';
return response()->json(['error' => $error_message], 500);
}
正常に処理を終えた場合は、transactionメソッドの戻り値で受け取ったuserの内容を返しています。
トランザクション処理の中で例外が起きた時は、例外を捕まえてエラーを返しています。
この時自分で投げた例外に関しては、「登録更新処理に失敗しました。」のようなメッセージにしています。
ちなみにbeginTransactionメソッドを用いたトランザクションでは、以下のようにトランザクションやそれに伴うロールバックとコミットといった処理を自分で制御する必要があります。
// トランザクションの開始
DB::beginTransaction();
try {
// =====================
// 登録や更新などの複数の処理
// =====================
// トランザクションをコミット
DB::commit();
} catch(Exception $exception) {
// トランザクションをロールバック
DB::rollBack();
}
※エラーハンドリングについては触れていません。
自分は普段transactionメソッドを用いた実装を使用しています。エラーハンドリングについて、見た感じ公式ドキュメントには記載されていなかったので今回自分なりの方法を簡単にまとめてみました。
実際はレスポンスを返す部分などは、整理した方がいいと思うのでお気をつけください!