年月日をユーザーに入力させる場合、「年」と「月」と「日」を別々のプルダウン(ドロップダウン)メニューで用意することが多いと思う。
年月日入力用のプルダウンメニュー
このようなフォームで取得した日付が正しいかどうかをチェックするバリデーション(2月30日や6月31日などを弾く)の設定方法は以下の通り。
プルダウン(ドロップダウン)で入力された日付(年月日)のバリデーションを設定する方法
↑のようなformを使う前提なので、viewは省略。
バリデーション用のフォームリクエストを作成する方法は以下の記事を参照。
Laravel フォームリクエストのバリデーションの設定方法
公式マニュアルも参照のこと。
Laravel 6.x バリデーション
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) { // 引数にフォームリクエストを設定
// 色々と処理をする
}
}