Quantcast
Channel: rana_kualuの記事 - Qiita
Viewing all articles
Browse latest Browse all 331

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

$
0
0

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

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

// 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ごと死んだ。何故。

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


Viewing all articles
Browse latest Browse all 331

Trending Articles