ハマログ

株式会社イーツー・インフォの社員ブログ

Laravelのカスタムバリデーションで日付の妥当性チェック

はじめに
Laravelの日付入力で入力画面が年/月/日に分割されているときに、標準Validatorに渡すためには入力値を調整する必要があって、
$inputs = $request->all();
$inputs['birthday'] = $inputs['birth_year'] . '/' .$inputs['birth_month'] . '/' .$inputs['birth_day'];
Validator::make($inputs, ...
みたいに書いてみたんだけど、他の画面では
$request->validate([...
って書いているプロジェクトだったので、統一したほうがいいよなーと思ったのと、そもそも入力値の配列を操作したくなかったので、カスタムバリデータで対応しました。
実装
まずカスタムバリデータを登録する場所を決める必要があります。
今回はどこかの例で見たServiceProviderに登録することにしました。

コマンドを実行
php artisan make:provider ValidatorServiceProvider
サービスプロバイダーに登録(config/app.php)
providers' => [
    // 略 
    App\Providers\ValidatorServiceProvider::class,
],
バリデーションを実装します(src/app/Providers/ValidatorServiceProvider.php)
class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('valid_date', function ($attribute, $value, $parameters, $validator) {
            if (!isset($parameters)) {
                return false;
            }

            if (!is_array($parameters)) {
                return false;
            }

            $data = $validator->getData();
            $year = $data[$parameters[0]];
            $month = $data[$parameters[1]];
            $day = $data[$parameters[2]];

            if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) {
                return false;
            }

            return checkdate($month, $day, $year);
        });
    }
// 略
呼び出し
$request->validate([
    'birth_year' => 'required|numeric|valid_date:birth_year,birth_month,birth_day',
    'birth_month' => 'required|numeric',
    'birth_day' => 'required|numeric',
]);
成功しました
checkdatedateLaravelLaravel5.7PHPValidationエラーチェックバリデーション日付

  kaneko tomo   2018年10月12日


関連記事

WordPressのカスタムフィールドでのチェックボックスの使い方

こんにちは、かねこです。 はじめに WordPressで、管理画面で指定した記事…

xampp+netbeansでデバッグ設定時にエラーphp5ts.dll見つかりません

この度、XAMPP1.8.3を利用してWindowsパソコンにNetBeans …

ChatGPT使ってみた

巷で噂のChatGPT。 当初はStable Diffusionなどの画像生成A…


← 前の投稿

次の投稿 →