Laravel7 年、月、日を別々にPostされる場合の年月日有効性チェックの仕方

必要なクラスを作成する

リクエストクラスを作成する

php artisan make:request DateRequest

DateRuleを作成する。

php artisan make:rule DateRule

該当コントローラを開いて編集する

バリデーションを行いたいメソッドのパラメータをDateRequestにする

    public function confirm(DateRequest $request)

DateRequestを宣言する

use App\Http\Requests\DateRequest;

DateRequest.phpを開いて編集する

年、月、日を格納するプライベート変数を用意する。

    private $birth_y;
    private $birth_m;
    private $birth_d;

コントローラから年、月、日を受け取ってプライベート変数に格納する処理を追加する。

    public function all($keys = null)
    {
        $results = parent::all($keys);

        $this->birth_y = $results['birth_y'] ?? null;
        $this->birth_m = $results['birth_m'] ?? null;
        $this->birth_d = $results['birth_d'] ?? null;

        return $results;
    }

ルールを定義する

    public function rules()
    {
        return [
            'birth_y' => [
                'required',
                'alpha_num',
                'max:4',
                new DateRule(
                    $this->birth_y,
                    $this->birth_m,
                    $this->birth_d,
                )
            ],
            'birth_m' => 'required|alpha_num|max:2',
            'birth_d' => 'required|alpha_num|max:2',
        ];
    }

DateRuleを宣言する

use App\Rules\DateRule;

DateRule.phpを開いて編集

年、月、日を格納するプライベート変数を用意する。

    private $birth_y;
    private $birth_m;
    private $birth_d;

コンストラクタで年、月、日を受け取ってプライベート変数に格納するようにする。

    public function __construct($birth_y, $birth_m, $birth_d)
    {
        $this->birth_y = $birth_y;
        $this->birth_m = $birth_m;
        $this->birth_d = $birth_d;
    }

バリデーションロジックを書く。

    public function passes($attribute, $value)
    {
        return checkdate(
            (int)$this->birth_m,
            (int)$this->birth_d,
            (int)$this->birth_y
        );
    }

バリデーションエラー時のエラーメッセージを追記する。

    public function message()
    {
        return '誕生日は、有効な日付を指定して下さい。';
    }

これでOK

DateRequest.phpの完成形

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\DateRule;

class DateRequest extends FormRequest
{
    private $birth_y;
    private $birth_m;
    private $birth_d;

    public function authorize()
    {
        return true;
    }

    public function all($keys = null)
    {
        $results = parent::all($keys);

        $this->birth_y = $results['birth_y'] ?? null;
        $this->birth_m = $results['birth_m'] ?? null;
        $this->birth_d = $results['birth_d'] ?? null;

        return $results;
    }

    public function rules()
    {
        return [
            'birth_y' => [
                'required',
                'alpha_num',
                'max:4',
                new DateRule(
                    $this->birth_y,
                    $this->birth_m,
                    $this->birth_d,
                )
            ],
            'birth_m' => 'required|alpha_num|max:2',
            'birth_d' => 'required|alpha_num|max:2',
        ];
    }

    public function attributes(){
        return [
            'birth_y' => '生年月日(年)',
            'birth_m' => '生年月日(月)',
            'birth_d' => '生年月日(日)',
        ];
    }

}

DateRule.phpの完成形

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class DateRule implements Rule
{
    private $birth_y;
    private $birth_m;
    private $birth_d;

    public function __construct($birth_y, $birth_m, $birth_d)
    {
        $this->birth_y = $birth_y;
        $this->birth_m = $birth_m;
        $this->birth_d = $birth_d;
    }

    public function passes($attribute, $value)
    {
        return checkdate(
            (int)$this->birth_m,
            (int)$this->birth_d,
            (int)$this->birth_y
        );
    }

    public function message()
    {
        return '誕生日は、有効な日付を指定して下さい。';
    }
}

返信を残す

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