あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、SEとしての経験から取り上げたり解説したりしています。

Laravelでトランザクションのロールバック例外を捕まえてエラー制御する方法

Laravelでトランザクションをかける方法は、ネットを検索すればすぐにクロージャーを使用した方法と手動でトランザクションを制御する方法が出てきます。

クロージャーで制御する方がシンプルに書けるので、クロージャーの方がオススメらしいです。

書き方はこんな感じ。

use DB;

// 省略

public function register($params)
{
    DB::transaction(function () use ($params) {
        $department = new Department();
        $department->fill($params);
        $department->save();
    });
}

これで更新時に例外が発生すれば自動的にロールバックしてくれます。

いろんなサイトでこの方法をこの内容でオススメしているのですが、自動でロールバックされたら困ってしまいますよね。

登録できなかったのに正常終了することになるので。

なのですが、他のサイトでは書いていませんが、実はロールバック時は例外がスローされます。

PHP7以降では、Throwable で全ての例外をキャッチできるので、こんな感じでエラー制御できます。

use DB;
use Throwable;
use App\CustomReturnClass;

// 省略

public function catchError($params) {
    try {
        register($params);
    } catch (Throwable $e) {
        return new CustomReturnClass('データの更新に失敗しました');
    }
}

public function register($params)
{
    DB::transaction(function () use ($params) {
        $department = new Department();
        $department->fill($params);
        $department->save();
    });
}

CustomReturnClassは適当な結果を返すクラスで、コンストラクタでメッセージを与えています。

こんな感じでLaravelではロールバックを制御できます。

なんで公式で書いてないのか不明ですが。。