プログラミング学習やフリーランスエンジニア情報を発信していきます。現役フリーランスエンジニア2人で運営してます!

  1. バックエンド

Laravelのバリデーション(Validation)を使ってみよう!

最終更新日:2019/04/02

本記事では、ブログ投稿システムを作りながらLaravelのバリデーションの使い方をわかりやすく解説していきます。

以下の記事の続きです。まだ読んでいない方はぜひご一読ください!

初心者の方でもLaravelの動作環境を簡単に作れるWINDIIオリジナルのソースコードを用意したので、実際に動かして学ぶとより深く理解できるようになります!

以下の記事を参考にご活用ください。

バリデーション(Validation)ってなに?

バリデーションとは、入力値を検証する機能です。ユーザから送られてきたデータは必ずしもシステムにあったデータとは限らないため、チェックする必要があります。

例えば、ブログ記事の投稿時、ユーザがタイトルを入れていなかった場合、

タイトルを入力してください。

などとメッセージを出してあげる感じです。

おそらくサービスを使っているとよくこのようなメッセージに出くわすと思うので、イメージしやすいと思います。

説明はこれくらいにして、さっそくバリデーションを実装してみましょう!

バリデーションを使ってみる

ブログ投稿のシステムの場合、タイトルと本文が未入力ですとブログ記事として成り立たないので、バリデーションしてみましょう。

app/Http/Controllers/ArticleController.phpstore() メソッドに以下の処理を追加します。

public function store(Request $request)
{
    $request->validate([
        'title' => 'required',
        'content' => 'required',
    ]);
    $article = new Article;
    $article->title = $request->title;
    $article->content = $request->content;
    $article->save();
    return redirect("/articles");
}

バリデーションをしているのは以下の部分です。

$request->validate([
    'title' => 'required',
    'content' => 'required',
]);

タイトルと本文を入力必須(required)に指定しています。

タイトルと本文が未入力の場合、エラーメッセージも表示したいので、resources/views/articles/create.blade.phpに以下の記述を追加します。

@extends('layouts.app')

@section('title', '新規投稿')

@section('content')

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<div>
  <form method="POST" action="/articles">
    ...省略
  </form>
</div>
@endsection

書き終えたら、タイトルと本文を未入力で投稿してみましょう。以下のように表示されるはずです。

エラーがちゃんと表示できてますね。(あとで日本語化するので、とりあえず英語のままで!)

入力を必須にする以外にも様々なバリデーションルールが用意されています。

例えば、タイトルは32文字以内というルールにしてみましょう。

先ほど設定したバリデーションルールを以下のように変更します。

$request->validate([
    'title' => 'required|max:32',
    'content' => 'required',
]);

以下のように長いタイトルを投稿してみましょう。

ちゃんとエラーが出ますね。

さらに、もう一つバリデーションルールをご紹介します。

すでにある投稿とかぶるタイトルを投稿した場合、エラーにしてみましょう。

コントローラのバリデーションルールを以下のように修正しましょう。

$request->validate([
    'title' => 'required|max:32|unique:articles',
    'content' => 'required',
]);

すでに存在しているタイトルを指定して投稿してみましょう。

すでにあるよ!とエラーが出てますね。

Laravelには他にも様々なバリデーションルールがあるのですが、その中からよく使うバリデーションルールをご紹介しました!

フォームリクエストを使う

先ほどまではバリデーションルールをコントローラに記述しました。もちろんこれでも全然よいのですが、バリデーションの処理を分離して管理する方法をご紹介します。

Laravelにはフォームリクエスト というバリデーション用の機能があります。

まずは、StoreArticle というフォームリクエストクラスを作成します。

php artisan make:request StoreArticle

実行すると、app/Http/Requests/StoreArticle.phpが生成されます。

中身を見てみると、こんな感じになっています。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreArticle 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 [
            //
        ];
    }
}

rules()メソッドの中に先ほどのバリデーションルールを書いてみましょう。

app/Http/Requests/StoreArticle.php

public function rules()
{
    return [
        'title' => 'required|max:32|unique:articles',
        'content' => 'required',
    ];
}

またauthorize()メソッドがtrueを返すように変更しましょう。
(ここでは認証ユーザに関する設定を行います)

public function authorize()
{
    return true;
}

次にコントローラを修正します。

app/Http/Controllers/ArticleController.phpを修正します。

まず、上の方に以下の記述を追加します。

amespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;
// 以下の記述を追加
use App\Http\Requests\StoreArticle;

class ArticleController extends Controller
{
    // 省略
}

次にstore()メソッドを以下のように修正します。

public function store(StoreArticle $request)
{
    // 削除
    /*$request->validate([
        'title' => 'required|max:32|unique:articles',
        'content' => 'required',
    ]);*/

    $article = new Article;
    $article->title = $request->title;
    $article->content = $request->content;
    $article->save();
    return redirect("/articles");
}

これで完了です。先ほどのようにタイトルと本文を空にして投稿してみましょう。

ちゃんとバリデーションされていますね!🎉

フォームリクエストを使うと、コントローラに直接バリデーションを書いた場合に比べて、コントローラがスッキリするのがわかりますね。

今回のような単純な例ではあまり気にならないかもしれませんが、実際のアプリケーション開発では、バリデーションだけで何十行にもなってしまうことがあります。そこでフォームリクエストを使うと、見通しがよくなるわけです。

エラーメッセージのカスタマイズ(日本語化)

先ほどまでで一通り、バリデーションの仕方を理解できたと思います。
最後に、バリデーションメッセージのカスタマイズの方法をご紹介します。英語だとユーザにわかりにくいので、日本語にしてしまいましょう!

app/Http/Requests/StoreArticle.phpを開いて以下を追加します。

public function messages()
{
    return [
        'title.required' => 'タイトルを入力してください。',
        'title.max' => 'タイトルは32文字以内にしてください。',
        'title.unique' => 'このタイトルはすでに使用されています。',
        'content.required'  => '本文を入力してください。',
    ];
}

これでカスタマイズ完了です。

タイトルと本文を空欄にして投稿してみましょう。

ちゃんと日本語化されました!🎉

長いタイトルを入力すると…

すでにあるタイトルを使用すると…

完璧ですね😁

まとめ

以上、バリデーションの使い方について一通りご紹介しました。
バリデーションは比較的地味な機能ですが、実際のアプリケーション開発では避けて通ることはできません。本記事でしっかりマスターしてしまいましょう!

次回は認証についてです!

The following two tabs change content below.

riri

25歳。 Twitter:りりー@ryudoi1 // windii socialというslackチャンネルで質問や雑談等受け付けてるので気軽に参加してください!(もちろん無料です) フリーランスになるまでの過程は こちら

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP