LoginSignup
1

More than 3 years have passed since last update.

【Laravel5.8】二つの配列パラメータ数が同じバリデーションがほしい

Posted at

二つの配列パラメータ数が同じバリデーションを追加したい。
一カ所だけでしか使わないからフォームリクエストを使うほどでもない。

どういうことかというとこんなかんじ。

// OK
test.php?name[]=100&value[]=980
test.php?name[]=100&value[]=980&name[]=200&value[]=2000
test.php?name[1]=100&value[1]=980

// NG
test.php?name[]=100&value[]=980&name[]=200
test.php?name[]=100&value[]=980&value[]=2000
test.php?name[1]=100&value[2]=980

たとえば商品IDと個数、みたいなセットで送る必要のあるパラメータに使いたい。
その場合はitems[商品ID]=個数とかのほうがいいだろうけど、3点以上のパラメータが必要だとか、色々とそうもいかないことがあるわけですよ。

コントローラ
    // バリデータ
    $validation = [
        'name' => 'required|array',
        'name.*' => 'required|integer',
        'value' => 'required|array',
        'value.*' => 'required|integer',
    ];
    $v = Validator::make($request->all(), $validation);

    // パラメータ数が同じバリデーション
    $v->after(function ($validator) {
        $data = $validator->getData();
        if (!isset($data['name']) || !isset($data['value'])
            || !is_array($data['name']) || !is_array($data['value'])
            || array_keys($data['name']) !== array_keys($data['value'])
        ) {
            $validator->errors()->add('name', 'nameとvalueの個数は同じでないといけない');
        }
    });

    // バリデーション実行
    if ($v->fails()) {
        return 'えらー';
    }

なんだこれ。
目的は達成しているのですがコードがとても微妙。

namename.*などのバリデーションに成功しても失敗しても必ずafterは呼ばれます。
すなわち当初の$validationと同等の事前チェックをafterにも再度書かないといけません。

だからといってチェック後の値を取得しようと$validator->getData()$validator->validated()にしたら無限ループで死にます。
あと試しに$validator->fails()ってしてみたらApacheごと死んだ。何故。

このあたりもうちょっとうまい書き方はないものだろうか。
おそらくあるんだろうけどよくわかりませんでした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1