年月日をユーザーに入力させる場合、「年」と「月」と「日」を別々のプルダウン(ドロップダウン)メニューで用意することが多いと思う。
年月日入力用のプルダウンメニュー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<form method="get" action="/"> <select name="datetime[year]"> <option value="2000">2000<option> <!-- 略 --> <option value="2020">2020<option> </select> <select name="datetime[month]"> <option value="1">1<option> <!-- 略 --> <option value="12">12<option> </select> <select name="datetime[day]"> <option value="1">1<option> <!-- 略 --> <option value="31">31<option> </select> </form> |
このようなフォームで取得した日付が正しいかどうかをチェックするバリデーション(2月30日や6月31日などを弾く)の設定方法は以下の通り。
プルダウン(ドロップダウン)で入力された日付(年月日)のバリデーションを設定する方法
↑のようなformを使う前提なので、viewは省略。
バリデーション用のフォームリクエストを作成する方法は以下の記事を参照。

公式マニュアルも参照のこと。
Laravel 6.x バリデーション
app/Http/Requests/PostRequest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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) { // 引数にフォームリクエストを設定 // 色々と処理をする } } |
コメントを残す