Laravel プルダウン(ドロップダウン)で入力された日付(年月日)のバリデーションを設定する方法

年月日をユーザーに入力させる場合、「年」と「月」と「日」を別々のプルダウン(ドロップダウン)メニューで用意することが多いと思う。

年月日入力用のプルダウンメニュー


このようなフォームで取得した日付が正しいかどうかをチェックするバリデーション(2月30日や6月31日などを弾く)の設定方法は以下の通り。

プルダウン(ドロップダウン)で入力された日付(年月日)のバリデーションを設定する方法

↑のようなformを使う前提なので、viewは省略。

バリデーション用のフォームリクエストを作成する方法は以下の記事を参照。

Laravel フォームリクエストのバリデーションの設定方法 Laravel フォームリクエストのバリデーションの設定方法

公式マニュアルも参照のこと。

Laravel 6.x バリデーション

https://readouble.com/laravel/6.x/ja/validation.html

app/Http/Requests/PostRequest.php


class PostRequest extends FormRequest
{
    /**
     *  rules()の前に実行される
     *       $this->merge(['key' => $value])を実行すると、
     *       フォームで送信された(key, value)の他に任意の(key, value)の組み合わせをrules()に渡せる
     */
    public function getValidatorInstance()
    {
        // プルダウンで選択された値(= 配列)を取得
        $datetime = $this->input('datetime', array()); //デフォルト値は空の配列

        // 日付を作成(ex. 2020-1-20)
        $datetime_validation = implode('-', $datetime);

        // rules()に渡す値を追加でセット
        //     これで、この場で作った変数にもバリデーションを設定できるようになる
        $this->merge([
            'datetime_validation' => $datetime_validation,
        ]);

        return parent::getValidatorInstance();
    }

    public function rules()
    {
        return [
            // getValidatorInstance()内で作成した値にバリデーションを設定
            'datetime_validation' => 'date' // 正しい日付かどうかをチェック(ex. 2020-2-30はNG)
        ];
    }

    public function messages() {
        return [
            'datetime_validation.date'  => "存在しない日付です。"
        ];
    }
}
app/Http/Controllers/PostController.php


namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\PostRequest; // フォームリクエスト(↑で作ったファイル)
use App\Post;
 
class PostController extends Controller
{
    public function index(PostRequest $request) { // 引数にフォームリクエストを設定
        // 色々と処理をする
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です