必要なクラスを作成する
リクエストクラスを作成する
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 '誕生日は、有効な日付を指定して下さい。';
}
}