1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-22

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

フォーム内の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されると
バリデーションエラーが実現できた。

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0