0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

laravel validation、第2引数を使ってのメッセージ設定

Posted at

【環境】
windows10 64bit
php 7.4.27
laravel 8

こんにちは、今回はこんなケースです。

まずは画像を見てもらいましょう。
case1.PNG

こんな感じで設定を行って、
➀ プレーヤまたはコンピュータのどちらにもチェックが入ってない場合にエラー
➁ 名前の欄が未記入ならエラー
 
という内容を、laravelのvalidationを使って表示させようとするという内容です。

完成図はこんな感じ
↓   ↓   ↓   ↓
case2.PNG

最初はこんなもん簡単にできるやろうと思ったが意外な落とし穴にはまってしまって苦戦しました。

まずこれの設定ですが、こんな感じ

index.html
{{-- エラーメッセージ --}}
@if ($errors->any())
@foreach ($errors->all() as $error)
<p> <strong style="color:red;">{{ $error }}</strong></p>
@endforeach
@endif
{{-- ここまで --}} 

/** ラジオボタンの設定 **//
  //プレーヤにチェック       = "1”を返す
  //コンピュータにチェック   = "0"を返す
  //どちらにもチェックがない = nullを返す
/** 名前入力の設定 **//
  //入力したものを返す。ただし、未記入の場合nullを返す
<p><input type="radio" name="chara" id="chara" value="1">プレーヤ</p>
 <p>デーモン様のお名前を入力してください</p>
<input type="text" id="player_name" name="player">
<p><input type="radio" name="chara" value="0">コンピューター</p>

共通しているのは、nullが返ってきたらバリデーションでエラーを返すと考えて、
"required"で設定すればいいかなと思ったが、

playersContoroller.php

        // バリデーション
        $validatedData = $request->validate([
            'chara' => 'required',
            'player' => 'required'
        ]);

そうするとこのように帰ってきます。
↓  ↓  ↓
case3.PNG

requiredの場合、このように設定されています。

validator.php
'required'             => ':attributeは必ず指定してください

:attributeはここでは、それぞれのname属性の名前が返ってきてます
(● ラジオボタン =>  name = "chara" , ● テキストボックス => name = "player")

これでは見ている人から見れば、何のエラーかわかりにくいですよね?
ましてや、名前を入れてないことのエラーが 「必ず指定してください」っていうのもなんか変((+_+))

というわけで、各々のrequiredにメッセージを入れるという設定をしないといけません。((+_+))

けど、私の知っているの方法としては、
● ruleのディレクトリを設定する
● middlewareのディレクトリを設定する

この2つの方法です。ちょっと面倒くさいと思いました、、、、が
###「いやいや第2引数にメッセージを作ったらそれで完結するよ」
と教えてもらい、すんごく楽チンでした。

こんな感じです。

playersContoroller.php(第2引数にメッセージ追加)
        // バリデーション
        $validatedData = $request->validate([
            'chara' => 'required',
            'player' => 'required'
], [    //ここから第2引数
            'chara.required' => '【エラー】:チェックしてください',
         'player.required' => '【エラー】:枠内を入力してください',     ここまで//  
    ]);

これでちゃんと設計通りにできました(^^)/
↓   ↓   ↓   ↓
case2.PNG

なお、今回の内容は、laravelの青本に書いてるとのことです。基本さえわかっていたら、そこまでググらなくても出てくるよ、、と

まとめると・・・やっぱり基礎にもどる習慣をつけておこうと思ったのでした。

基礎を見なおす → なかったらググる

以上です。

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?