🌵

Laravelで大量のリクエストパラメータを送るときにFormRequestはやめたほうがいい話

に公開

概要

業務で一括処理を行っているAPIに対して、配列・JSONで数千件のパラメータを送りつけると、何かとても遅かった
(Laravel 9.4で確認)

原因

FormRequestで、配列パラメータに対してアスタリスク指定の検証があると遅い。
対象4,000件で、検証だけで2分以上かかる

[
    'key.*.value' => 'required|boolean',
]

原因として、計算がn^nになるとのこと。Laravel10以降でも問題解消しないらしい
https://github.com/laravel/framework/issues/49375

そうはいっても配列パラメータに対してアスタリスクは使いたい

対策

バリデーションライブラリのRespect\Validation\Validatorを導入する

composer.json
"respect/validation": "^2.3",

これのよいところは、配列の何行目でエラーになったかをFormRequestと同じく検知できるところ。
他でもできるかもしれないですが、ドキュメントで把握できたのがこちらだったのでこちらを採用
こんなイメージで検証可能

$validators = [
    'coustomer_id' => v::intVal(),
    'name' => v::stringType()->length(null, '20')
];

foreach ($targets as $index => $row) {
   foreach ($validators as $key => $validator) {
        $value = $row[$key] ?? null;
        try {
             $validator->assert($value);
        } catch (ValidationException $e) {
            // エラーメッセージ登録
            $errors[] = $this->getErrorMessage(
                $key,                        
                $index + 1
            );
        }
   }
}

結果

対処前

対処後

大幅に速度改善できました

既存のFormRequestを生成AIに渡せば、よしなに置換・実装してくれるので
こういう問題があると知っておくだけでも良さそうです

株式会社THIRD エンジニアブログ

Discussion