【Laravel 入門】フォームの入力内容を検証する(バリデーション)

Laravel

今回は、ユーザーがフォームに入力した内容が正しい形式で書かれているかを検証する「バリデーション」という機能について解説していきます。


参考書

基本的な使い方

まずはテンプレートを用意します。

@section('content')
  <p>{{$msg}}</p>
    <form action="/sample" method="post">
        <table>
            @csrf         
            <tr><th>名前:</th><td><input type="text" name="name"></td></tr>
            <tr><th>メール:</th><td><input type="text" name="mail"></td></tr>
            <tr><th>年齢:</th><td><input type="text" name="age"></td></tr>
            <tr><th></th><td><input type="submit"></td></tr>
        </table>
    </form>
@endsection


そしてコントローラに validate メソッドを記述して検証機能をもたせます。

class SampleController extends Controller
{
    public function index(Request $request) {
        return view('sample.index', ['msg'=>'フォームを入力']);
    }

    public function post(Request $request) {
        $rules = [
            'name'=> 'required',
            'mail'=> 'email',
            'age'=> 'numeric',
        ];
        $this->validate($request, $rules);
        return view('sample.index', ['msg'=>'OK']);
    }
}


フォームがPOST送信されたときの処理である post メソッドに、

$this->validate($request, 検証ルールの配列 );

と記述することでバリデーションを利用することができます。


検証ルールの配列には、

[
    'name属性値'=> '検証ルール',
    'name属性値'=> '検証ルール',
                    :
];

という形式で記述します。


今回の場合は、

‘name’=> 必須項目,
‘mail’=> メールアドレスの形式(○○@○○.○○),
‘age’=> 数字で入力,


という条件になります。


フォームを全て適切に入力して「送信」を押すと、メッセージが「OK」に変わります。


不適切なまま「送信」を押すと、検証の後に用意された処理は実行されず、フォームが再表示されます。

エラーメッセージの表示

次は、どの項目でどのようなエラーが出ているのかを表示させたいと思います。

テンプレートを以下のように記述します。

@section('content')
    <p>{{$msg}}</p>
    <form action="/sample" method="post">
        <table>
            @csrf
            @error('name')
            <tr><th>エラー</th><td>{{$message}}</td></tr>
            @enderror
            <tr><th>名前:</th><td><input type="text" name="name" value="{{old('name')}}"></td></tr>
            @error('mail')
            <tr><th>エラー</th><td>{{$message}}</td></tr>
            @enderror
            <tr><th>メール:</th><td><input type="text" name="mail" value="{{old('mail')}}"></td></tr>
            @error('age')
            <tr><th>エラー</th><td>{{$message}}</td></tr>
            @enderror
            <tr><th>年齢:</th><td><input type="text" name="age" value="{{old('age')}}"></td></tr>
            <tr><th></th><td><input type="submit"></td></tr>
        </table>
    </form>
@endsection


エラーの表示には@errorディレクティブを使います。

@error('名前')
 ... {{$message}} ...
@enderror

指定した名前の項目でエラーが発生した場合に@error の中身が表示されます。

発生したエラーメッセージが $message という変数に渡されるため、{{$message}} とするだけでエラーメッセージを表示させることができます。
(ただし英語)


また、<input>タグ

value=”{{old(‘ 名前 ‘)}}”

を追加することで、前回送信したときの値を保持することができます。

エラーが出て送信に失敗する度に最初から入力し直すのは面倒なので、これを設定しておくと親切ですね。

フォームリクエスト

コントローラとは切り離してバリデーションを管理したい場合、「フォームリクエスト」を使用します。

これを使うことで、クライアントから送られてくるリクエストに、フォームに関する機能を組み込むことができます。


では、コマンドラインで以下を実行し、フォームリクエストを作成します。

php artisan make:request SampleRequest


作成したフォームリクエストは、「app/Http/Requests」の中に配置されます。

「SampleRequest」を以下のように記述します。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SampleRequest extends FormRequest
{
    public function authorize()
    {
        if ($this->path() == 'sample') {
            return true;
        }else{
            return false;
        }
    }

    public function rules()
    {
        return [
            'name'=> 'required',
            'mail'=> 'email',
            'age'=> 'numeric',
        ];
    }
}


authorize メソッドは、このフォームリクエストの利用許可を管理するものになります。
(true を返せば許可、false を返せば不許可)

$this->path() でアクセスしたパスを取得します。
今回の場合は、「/sample」というパスでアクセスしたときにフォームリクエストの利用を許可するということですね。


rules() メソッドは、配列で検証ルールを設定します。
先ほど作ったものをそのまま移しています。


あとは、コントローラを以下のように修正します。

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\SampleRequest;//追加

class SampleController extends Controller
{
    public function index(Request $request) {
        return view('sample.index', ['msg'=>'フォームを入力']);
    }

    public function post(SampleRequest $request) {
        return view('sample.index', ['msg'=>'OK']);
    }
}


use 文で SampleRequest クラスをインポートし、post アクションの引数でそのインスタンスを指定することで、フォームリクエストに設定した内容をもとにバリデーションが実行されます。

これで、コントローラからバリデーションを切り離すことができました。

エラーメッセージのカスタマイズ

デフォルトでは英語でエラーメッセージが出力されるため、日本語で表示させるには message メソッドを追加します。

public function messages()
{
    return [
        'name.required'=> '名前を入力してください',
        'mail.email'=> 'メールアドレスの形式で入力してください',
        'age.numeric'=> '数字で入力してください',
    ];
}


ご覧のように、

return [
    'name属性.検証ルール'=> 'エラーメッセージ',
    'name属性.検証ルール'=> 'エラーメッセージ',
                       :
];

という形式で記述することで、エラーメッセージを変更することができます。

バリデータの作成

エラーがあった場合にフォームページにリダイレクトせず、別の処理を行いたい場合にバリデータを用意して使うことができます。

コントローラを以下のように記述します。

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;//追加

class SampleController extends Controller
{
    public function index(Request $request) {
        return view('sample.index', ['msg'=>'フォームを入力']);
    }

    public function post(Request $request) {
        $rules = [
            'name'=> 'required',
            'mail'=> 'email',
            'age'=> 'numeric',
        ];
        $messages = [
            'name.required'=> '名前を入力してください',
            'mail.email'=> 'メールアドレスの形式で入力してください',
            'age.numeric'=> '数字で入力してください',
        ];
        $validator = Validator::make($request->all(), $rules, $messages);
        if ($validator->fails()) {
            return redirect('/sample')
                    ->withErrors($validator)
                    ->withInput();
        }
        return view('sample.index', ['msg'=>'OK']);
    }
}


バリデータは、Validator インスタンスmake メソッドで作成することで使えるようになります。

$validator = Validator::make( 値の配列 , 検証ルールの配列 , エラーメッセージの配列 );


第1引数には検証する値をまとめた配列を入れます。
すべて検証する場合は、$request->all() とします。


$validator->fails() は、エラーが発生した場合に true を返します。

redirect(‘○○’) で指定のアドレスにリダイレクトすることができますが、その際にエラーメッセージとフォームの値も渡したい場合は以下のように書きます。

return redirect('○○')
        ->withErrors($validator)//エラーメッセージを引継ぐ
        ->withInput();//フォームの入力内容を引継ぐ





今回は以上になります。
ご覧いただきありがとうございました(^^)


参考書


続きはこちら↓

コメント

コンタクトフォーム

    タイトルとURLをコピーしました