Laravel validation バリデーションの作成から使い方まで紹介

Laravel

Laravel ver.8.x でローカル環境と日本語設定する方法はこちら

Laravel Breeze ログイン認証と日本語化対応方法
Laravel 8.xからLaravel Breezeを用いてログインを認証を簡単に実装することができます。前バージョンの認証ライブラリとの比較から、laravelとLaravel Breezeのインストール、また日本語化の対応方法について解説していきます。

1.Validation(バリデーション)がなぜ必要か?

入力フォームの値をチェックすることをバリデーションと呼びます。

問い合わせフォームなどので名前やメールアドレスが適切に入力されているかをチェックして、意図しない入力は受け付けないように制御できます。

テキストフィールドにおいて、任意の値を受け付けていたとすると、特殊文字(&<>”’;  etc)が入力可能になります。

<script>alert(document.cookie)</script>

例えば、このようなスクリプトタグが実行できてしまうと、入力してフォームを送信後、alert(アラート)が表示されます。

このようなスクリプトタグが実行できてしまうと、クロスサイトスクリプティング(XSS)という脆弱性を生んでしまいます。

そのため入力フォームに対して適切にバリデーションする必要があります。

2.入力フォームの準備

TAILBLOCKSを使ってビュー側のテンプレートを用意します。
tailwindcssはLaravel8から導入されたcssで、tailblocksはtailwindcssを使用しています。

tailblocks-contact

画面上部の「VIEW CODE」でコードをコピーします。

View側

TAILBLOCKSでコピーしたコードを新規作成したview(blade)に張り付けます。

resources/views/contact.blade.php

<x-guest-layout>
  <x-slot name="header">
    <h2 class="font-semibold text-xl text-gray-800 leading-tight">
      {{ __('Contact') }}
    </h2>
  </x-slot>
  <section class="text-gray-600 body-font relative">
    <div class="container px-5 py-24 mx-auto">
      <div class="flex flex-col text-center w-full mb-12">
        <h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-gray-900">Contact</h1>
        <p class="lg:w-2/3 mx-auto leading-relaxed text-base">下記のフォームよりお問い合わせ下さい。</p>
      </div>
      <div class="lg:w-1/2 md:w-2/3 mx-auto">
        <form method="POST" action="{{ route('contact.store') }}">
          @csrf
          //以下、省略
        </form>
      </div>
    </div>
  </section>
</x-guest-layout>

<x-guest-layout>はlayoutフォルダにデフォルトで格納されているguest.blade.phpを使用するように設定。

guest.blade.phpはcssの読み込みなどを行っている。
(これによりtailblocksがそのまま使用可能)

以下のようなformタグを入力フォーム要素の上あたりに追加。

<form method="POST" action="{{ route('contact.store') }}">

Controller側

artisan makeコマンドで作成

php artisan make:controller ContactController

コントローラーファイル内は一旦、動確用に下記を用意。
app\Http\Controllers\ContactController.php

class ContactController extends Controller
{
  public function store(Request $request){
    $request->name;
    $request->email;
    $request->message;
    dd('contact test', $request->name, $request->email, $request->message);
    return null;
  }
}

ボタンからフォームの値を送信後、入力フォームの値が取れるか、上記のようにdd()で確認。(ddまで読み込まれるとそこで、ストップする)

Route側

routes/web.php

use App\Http\Controllers\ContactController;

Route::get('/contact', function () {
    return view('contact');
})->name('contact');

Route::post('/contact', [ContactController::class,'store'])->name('contact.store');

getでcontactページを表示。
postでフォームから送信された後に、storeメソッドにルーティング。

初回表示確認

php artisan serve

http://127.0.0.1:8000/contact

form-view

フォームに値を入力して「送信」。

フォームに入力された値がcontroller側のdd()で取得できていることがわかる。
またpostのルーティングもできていることが確認できる。

3.Validation(バリデーション)の使い方

Controller側にバリデーションを直接記載する方法とRequestFormを作成して、バリデーション処理を別ファイルに記載する方法を紹介します。

controller側へ直接記載する

public function store(Request $request){
  $request->validate([
    'name' => 'required|string|max:16|alpha',
    'email' => 'required|string|email',
    'message' => 'required|string|max:500',
  ]);
  return redirect()->route('contact');
}

 

RequestFormを作成して、バリデーションを用意する

artisanコマンドでRequestクラスを作成。

php artisan make:request ContactRequest

 

rulesに各バリデーション記載する。
app\Http\Requests\ContactRequest.php

 public function rules()
{
  return [
    'name' => 'required|string|max:16|alpha',
    'email' => 'required|string|email',
    'message' => 'required|max:500|alpha_num',
  ];
}

使用可能なルールについては、Laravel バリデーションの「使用可能なバリデーションルール」部分をご確認下さい。

Controller側
作成したContactRequestクラスを読み込むようにする。

use App\Http\Requests\ContactRequest;

public function store(ContactRequest $request){
  return redirect()->route('contact');
}

別ファイルにわけることでコントローラー側を簡潔にさせることができます。

4.バリデーションメッセージの表示

バリデーションメッセージを画面に表示できるようにView側へ追記して、確認していきます。

View側

resources\views\contact.blade.php
<form>タグの上あたりに以下を追加。

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

 

デフォルトの場合(validation.php)

validation-message

設定したルールに応じて、laravelで予めメッセージが用意されています。

resources\lang\en\validation.php

メッセージを日本語にする場合は、
config\app.php
にてlocaleをenからjaにします。

'locale' => 'ja',

日本語メッセージの用意

またlangの下にjaフォルダを作成して、その中にvalidation.phpを作成します。
(enからのコピーでOK)

resources\lang\ja\validation.php
必須入力(required)なら、以下のように記載します。

'required' => ':attribute を入力して下さい。',

attributeも以下のように日本語に変換できます。

 'attributes' => [
   'name' => '名前',
   'email' => 'メールアドレス',
   'message' => 'メッセージ',
 ],

未入力で「送信」すると、各入力項目のバリデーションメッセージが日本語で表示されるようになります。

validation-message-ja

5.バリデーションメッセージのカスタマイズ

RequestForm(ContactRequest)にmessages関数を作成することができます。
(またはコントローラー側にカスタムメッセージを直接記載)
その中でバリデーションメッセージを定義すると、定義したメッセージが優先されます。

 public function messages()
{
  return [
    'name.required' => '名前を入力して下さい。',
    'name.max' => '名前は16文字以内で入力して下さい。',
    'name.alpha' => '名前に不正な文字が含まれています。',
    'email.required' => 'メールアドレスを入力して下さい。',
    'email.email' => 'メールアドレスの書式が正しくありません。',
    'message.required' => 'メッセージを入力して下さい。',
    'message.max' => 'メッセージは500文字以内で入力して下さい。',
    'message.alpha_num' => 'メッセージに不正な文字が含まれています。',
  ];
}

「送信」で、カスタムメッセージの内容が表示されればOK。

validation-message-ja2