Laravel11、validationをControllerのメソッドに内包すると結果が変わる

タイトルは短いのでうまく表現できませんが、以下の通りです。

// これだと問題なくbladeでエラーを拾える。
public function store(CustomRequest $request)
{
    $validator = Validator::make($request->all(), []);
    $validator->errors()->add('エラー属性のキー', 'エラーメッセージ')
    return back()
            ->withErrors($validator)
            ->withInput();
}

// 以下ではエラーを拾わないのでbladeではold関数で入力値の復元もしない。
public function store(CustomRequest $request)
{
    return shareMethod($request);
}

private function shareMethod(CustomRequest $request) {
    $validator = Validator::make($request->all(), []);
    $validator->errors()->add('エラー属性のキー', 'エラーメッセージ')
    return back()
            ->withErrors($validator)
            ->withInput();
} 

Laravel8からクリーンインストールした11へソースレベルで移行しました。
.envの初期値が変わっているんですね。
8では「APP_MAINTENANCE_DRIVER=file」
だったのが
11では「APP_MAINTENANCE_STORE=database」
に変わっているんですね。
shareMethod()で返した方はエラーセッションがnullになっていました。
11でも「APP_MAINTENANCE_DRIVER=file」に設定することで良好になりました。

どっちがいいの?

小規模では「file」だと思います。
今回の件も含め、パフォーマンスやコスト面でも良いと思います。
「database」は大規模に効果があると思います。
DB化することでサーバーをロードバランサーで分散している場合でもセッションを維持できますね。
これが最大のメリットと思います。
今回の件がバグかどうかはわかりませんが、databaseで利用する場合はControllerでエラーレスポンスするには最上層のメソッドで返す必要がありそうです。

投稿者プロフィール

TakaharaRyuji
PAGE TOP