laravel5.5

【バリデーション】2つのカラムのどちらか一方は必須としたい。

2つカラムがあって、どちらか片方は必須としたい。
ここでしか使わないんだからValidatorの拡張はめんどくさい。あぁ、めんどうだ。

下のソースの場合、telかemailのどちらか片方は入力して欲しい。ちなみに、timeはtelが入力されたら必須です。

Controllerに書く。

InquiryController.php
                 // ベースとなるルール
        $rules = [
            'name' => 'required|max:255',
            'tel' => 'sometimes|numeric|max:14',
            'time' => 'required_with:tel',
            'email' => 'sometimes|max:255|email',
            'text' => 'max:1024',
        ];
        // 電話番号かメアドかのどちらかは必須
        if (is_null($request['tel']) || is_null($request['email'])) {
            // 電話番号が空の場合、電話番号のバリデーションをクリアし、メアドのバリデーションを追加する。
            if (is_null($request['tel'])) {
                $rules['email'] = 'required_without:tel|sometimes|max:255|email';
                $rules['tel'] = '';
            }
            // メアドが空の場合、メアドのバリデーションをクリアし、電話番号のバリデーションを追加する。
            if (is_null($request['email'])) {
                $rules['tel'] = 'required_without:email|sometimes|numeric|max:14';
                $rules['email'] = '';
            }

        }
        $validator = Validator::make($request->all(), $rules);

telもemailも入力されていないと「emailが指定されていない場合、telを指定してください。」と表示されます。
telは入力ありで、timeが未選択だと「telが指定されている場合、timeも指定してください。」と出ます。
ここはもう少し考えよう……。

と、自分メモでした。

[追記]
おまけです。
エラーメッセージのtelとかtimeとか、日本語にしました。
これの下の方に「attributes」ってあるので、その配列のところに定義します。

resources/lang/ja/validation.php
    'attributes' => [
        'email' => 'メールアドレス',
        'name' => '名前',
        'tel' => '電話番号',
        'time' => '連絡可能時間帯',
        'text' => 'その他ご要望等',
    ],