##バリデーションで実現したい事
フォーム内のselectで選択されずに(option hiddenの項目が選択されたまま)submitされた時、
バリデーションエラーにする。
今回は「会社」を登録する時の情報のうち
住所の「都道府県」をselectから選択するようにした。
//省略
//都道府県データ
//$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
<?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で読み込む
<?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をセットする
//省略
//都道府県データ
//$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されると
バリデーションエラーが実現できた。
もっと良い方法があれば、コメントいただけると喜びます。