Laravel

【初心者向け】Laravelで一番簡単なバリデーションをする方法

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

⇨ Laravel 記事の目次はこちら

Laravel で一番簡単なバリデーションを実装していきます。

バリデーションは、例えば、「数字以外がきたら弾く」「必須項目が空だったら弾く」「文字数の上限が超えていたら弾く」といった、機能になります。

システムが予期しないデータを入力された時に、しっかり弾かないとエラーの原因になったりするので、しっかりと設定しなければなりません。

前回作った投稿機能にバリデーションをつけてみます。

⇨ 前回の記事(Laravel で投稿機能を作ってみる)

環境

MacOS

Laravel6

前回投稿機能を作成したコード

コントローラー

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

//追記
use App\Post;

class PostController extends Controller
{
    public function store(Request $request)
    {
        $post = new Post;
        $post->name = $request->name;
        $post->title = $request->title;
        $post->content = $request->content;
        $post->save();
        return redirect()->route('post.create');
    }
}

このコントローラーで name と title と content の3つが保存できるようになっています。

バリデーションを実装する

この記事はコントローラーに書くという最も単純な方法について説明しています。最終的には、フォームリクエストにもチャレンジしてみてください。

⇨Laravel のフォームリクエストでバリデーションする

今回つけるバリデーションは、全ての項目を「必須(required)」とするものです。

//追記
use Validator;

class PostController extends Controller
{
    public function store(Request $request)
    {
        //追記
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'title'  => 'required',
            'content' => 'required'
        ]);

        if ($validator->fails()) {
            return redirect()->back()
            ->withInput()
            ->withErrors($validator);
        }
        //追記ここまで

        $post = new Post;
        $post->name = $request->name;
        $post->title = $request->title;
        $post->content = $request->content;
        $post->save();
        return redirect()->route('post.create');
    }
}

一番これが簡単なバリデーション機能の付け方だと思います。

解説

ほぼ定型文で良いと思います。

機能によって変わる部分はここになります。

//追記
$validator = Validator::make($request->all(), [
    'name' => 'required',
    'title'  => 'required',
    'content' => 'required'
]);

カラムが必須じゃないところには、 nullable を指定したり、文字列のところには string を指定したりします。

この指定できる内容については、

Laravel 公式ドキュメント「使用可能なバリデーションルール」

に記載されています。

複数指定する

//追記
$validator = Validator::make($request->all(), [
    'name' => 'required|string',
    'title'  => 'required|string',
    'content' => 'required|string'
]);

このように|で区切ることで複数指定することができます。

表示側にどのカラムのバリデーションが引っかかったかを伝える

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

Blade にこれを記述してみてください。バリデーションに引っ掛かるとこのように表示されます。

Laravelバリデーション画像

$errors は、空の時は表示されないように middleware で設定されているので!empty()などで空判定する必要はないようになっています。

バリデーションメッセージを自由に設定する

required といった、バリデーションのルールや、name といったカラムの文字を自由に設定することができます。

これは、Laravel の公式ドキュメントでいうところの、他言語化のところの機能をつかいます。

まず、config/app.php を修正します。

'fallback_locale' => 'ja',

en を ja に変更してください。

次に resources/lang/ja/validation.php を作成します。

その中に、

<?php
return [
    'required' => ':attributeは必須です',

    'attributes' => [
        'title' => 'タイトル'
    ]
]

を記述します。

Laravelバリデーション画像2

required と、title だった箇所が今設定した「必須です」と「タイトル」に変更されました。

このように自由に変更することが可能です。

=>Laravel のバリデーションで errors が表示されないときの解決方法

まとめ

いかがだったでしょうか?

一番簡単な Laravel のバリデーション方法について書きました。

バリデーションはバックエンドを学んで実務に付きたい場合、非常に大事なところであると思います。

今回このような書き方をしましたが、更にワンランクアップさせた(ファットコントローラーを回避する書き方)にも挑戦してみましょう。

⇨Laravel のフォームリクエストでバリデーションする

ほとんど今回の記述を生かした方法で実装が可能になります。

最後におすすめの本の紹介をして終わりにします!

記事の内容に関する苦情などは Twitter の DM でお願いします。