15
10

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 3 years have passed since last update.

Laravelでのバリデーション(値チェック)の方法

Last updated at Posted at 2019-05-07

Laravelでのバリデーション(値チェック)の方法を紹介します。

#サンプルblade


<div class="wrapper">
    @if(count($errors) > 0)
        <ul class="bg-danger">
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    @endif

    <form action="{{ route('sample.store') }}" method="post">
        @csrf
        <div class="form-group">
            <label>名称<span class="required">※必須</span></label>
            <input type="text" name="name" class="form-control">
        </div>

        <div class="form-group">
            <label>チェックボックス<span class="required">※必須</span></label>
            <div class="checkbox">
                <label class="checkbox-inline">
                    <input type="checkbox" name="checkbox[]" value="1">A
                </label>
                <label class="checkbox-inline">
                    <input type="checkbox" name="checkbox[]" value="2">B
                </label>
                <label class="checkbox-inline">
                    <input type="checkbox" name="checkbox[]" value="3">C
                </label>
            </div>
        </div>

        <div class="form-group">
            <label>ラジオボタン<span class="required">※必須</span></label>
            <div class="radio">
                <label class="radio-inline">
                    <input type="radio" name="radio" value="1">A
                </label>
                <label class="radio-inline">
                    <input type="radio" name="radio" value="2">B
                </label>
                <label class="radio-inline">
                    <input type="radio" name="radio" value="3">C
                </label>
            </div>
        </div>

        <button type="submit" class="btn btn-success">登録</button>
    </form>
</div>

#バリデーションルール作成
以下のコマンドを実行します

$ php artisan make:request ValidateSample

すると、以下のファイルが作成されます。

app/Http/Requests/ValidateSample.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ValidateSample extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

まず、authorizeメソッドのreturn falsereturn trueに修正します。
(本来は権限チェックが必要な場合は、ここでチェックすることもできます。でも他の箇所ですることが多いです。)

では、rulesメソッドの中を書いていきます。

public function rules()
{
    return [
        'name' => 'required|max:30',
        'checkbox' => 'required',
        'radio' => 'required',
    ];
}

連想配列のキーが、html側のnameと一致させるように書きます。
連想配列の値に適用したいルールを書きます。
ルールはこちらの「使用可能なバリデーションルール」を参照。
(使うものはだいたい限られますが)

続いて、作成したルールが適用されるようにControllerを修正します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests\ValidateSample; //★追加★

class SampleController extends Controller
{
    ...
public function store(ValidateSample $request) //★もともとRequestだった箇所をValidateSampleに置き換え★
{
    ...

では、画面から登録ボタンを押してみましょう。

スクリーンショット 2019-05-07 14.30.05.png

あ!エラーメッセージが英語だったぞ...

エラーメッセージを日本語化する場合は、こちらから日本語ファイルを持ってくると便利です。
(今回、関係あるのはvalidation.phpだけですが...)
配置する場所はresources/lang/jaの中です。

すると、こうなります。
スクリーンショット 2019-05-07 14.49.04.png

いや、ちょっと英語残ってるやんけ。
というわけで、先程作成したバリデーションファイルにattributesメソッドを追加します。

app/Http/Requests/ValidateSample.php
public function attributes()
{
    return [
        'name' => '名称',
        'checkbox' => 'チェックボックス',
        'radio' => 'ラジオボタン',
    ];
}

連想配列のキーにhtmlのname属性、値に日本語訳をつっこみます。で、登録!

スクリーンショット 2019-05-07 15.07.30.png

よし!日本語なった!
あー、でも、もうちょっと親切なメッセージにしたいぜ。というそこのアナタ!
messagesメソッドを追加しましょう。

app/Http/Requests/ValidateSample.php
public function messages()
{
    return [
        'checkbox.required' => 'チェックボックスは最低1つはチェックを入れてください。',
    ];
}

連想配列のキーに、htmlのname属性と、さらに.でつなげて、バリデーションの値を書きます。
連想配列の値はフルメッセージです。

すると、こうなる。
スクリーンショット 2019-05-07 14.58.26.png

#おわりに
基本的にwebシステムなどを作成するときは、JavaScriptとphp両方でバリデーションすると思いますので、あまりphpのエラーメッセージは重要視されないかもしれませんが...

JavaScriptでやれば、エラーメッセージを対象の項目の下に出すのも楽ですからね。(私はVue.jsを使用しています)
マスター関連とかは、めんどくさくなってphpだけにしちゃったりしますので、そういうときに結構役立つかも。

そういえば、エラーになったときに、前回の入力値はどうやって表示するの?という疑問を持った方のための記事も作成する予定です。

15
10
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
15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?