エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】カスタムバリデーションで入力が空だと動かない問題【713日目】

入力が空だとバリデーションが動かない

Validator::extend('required_if_xxx_and', function($attribute, $value, $parameters) {

    // なんらかの処理追加する

    // 通常のrequired_ifをする
    $param_required_if = implode(",", $parameters);

    $result_for_require_if = Validator::make(
        request()->all(),
        [$attribute => 'required_if:'.$param_required_if]
    )->passes();

    return $result_for_require_if;
}

こんなふうに、requireを拡張してあげたい。
つまり、入力が空に対してもバリデーションをしたい。

しかし、これでは動かないです。

なぜか。

バリデーションは、required系とその他で違う

requiredとか、空のときに動くバリデーションと、そうでないバリデーションは扱いが違います。

バリデートする属性が存在していない場合か、requiredルールで定義している「空」の場合、カスタム拡張したものも含め、通常のバリデーションルールは実行されません。

ってことでどうするか。

Validator::extendImplicit

Validator::extendだった場所を Validator::extendImplicitに変更する

Validator::extendImplicit('required_if_xxx_and', function($attribute, $value, $parameters) {

    // なんらかの処理追加する

    // 通常のrequired_ifをする
    $param_required_if = implode(",", $parameters);

    $result_for_require_if = Validator::make(
        request()->all(),
        [$attribute => 'required_if:'.$param_required_if]
    )->passes();

    return $result_for_require_if;
}

これでバリデーションがかかるようになります。

ドキュメント

readouble.com

このドキュメントの一番下辺りとか。