Laravelのselectフォームでoption hiddenを利用した時のvalidationについての忘備録


バリデーションで実現したい事

フォーム内のselectで選択されずに(option hiddenの項目が選択されたまま)submitされた時、
バリデーションエラーにする。

今回は「会社」を登録する時の情報のうち
住所の「都道府県」をselectから選択するようにした。

corp/create.blade.php
//省略

//都道府県データ
//$prefs =['北海道','青森県','岩手県'・・・・];

  <select name="pref" required>
    <option hidden>都道府県</option>
    @foreach ($prefs as $pref)
      <option value="{{ $pref }}" selected>{{ $pref }}</option>
    @endforeach
  </select>

上記のような場合、selectで「都道府県」は選択出来ないようになっているが
選択しないまま送信すると「都道府県」がvalueとなって送信されて、
requiredのバリデーションが掛からない。

そこで選択されていない場合、バリデーションエラーとなるように以下のように修正した。

カスタムバリデーションを登録する

php artisan make:request CorpRequest

Requestフォルダに「CorpRequest.php」が作成されるので
カスタムバリデーションを設定する。
今回は「prohibited_if」を利用した。ついでにエラーメッセージも登録。

バリデーション参考:
Laravel公式ドキュメントサイト: ReaDouble

app/Http/Request/CorpRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CorpRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;//※trueに変更
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'pref' => 'prohibited_if:pref,null',
        ];
    }

    public function messages()
    {
        return [
            'prohibited_if' => ':attributeを選択してください。',
        ];
    }
}

作成した「「CorpRegisterRequest」をcontrollerで読み込む

app/Http/Controller/CorpController.php
<?php
namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Corp;
use App\Http\Requests\CorpRequest;//クラスを読み込む

//省略

    public function store(CorpRequest $request)//RequestをCorpRequestに変更
    {
        Corp::create([
            'pref' => $request->pref,
//以下省略

viewの一部を修正

selectを選択せずにsubmitするとprefにnullをセットする

corp/create.blade.php
//省略

//都道府県データ
//$prefs =['北海道','青森県','岩手県'・・・・];

  <select name="pref" required>
    <option value="null" hidden>都道府県</option> //valueに「null」を設定
    @foreach ($prefs as $pref)
      <option value="{{ $pref }}" selected>{{ $pref }}</option>
    @endforeach
  </select>

以上のように変更することで、selectのhiddenが選択されたままsubmitされると
バリデーションエラーが実現できた。

もっと良い方法があれば、コメントいただけると喜びます。