1
0

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 1 year has passed since last update.

三井寿「安西先生……!!Laravelでバリデーションがしたいです………」

Last updated at Posted at 2022-06-12

安西先生「諦めたら、そこで堅牢なWebサイトの終了ですよ」

冗談は縦置き、さっそく本題です。

validateメソッドを使おう

こちらの記事はLaravelドキュメントのバリデーションの部分の最低限の機能を分かりやすいようにかみ砕いたものになります。

「ドキュメントの表現が堅苦しくて分からないよ~」って方には丁度いいかと思います👍

それでは表題通り、Laravelでバリデーションを実装する方法をご紹介しましょう。

一番簡単なのはRequestオブジェクトが提供しているvalidateメソッドを使うことです。

今回はこちらを紹介します。

バリデーションって美味いん?

美味くはないですが、機能的にはかなり旨いです😋(全然上手いこと言えてない)

おさらいですが、バリデーションは「入力されたデータのフォーマットが正しいかを検証する」機能です。

入力必須の項目が空欄だったり、年齢のところに日本語が入ったり、メールアドレスのところにメールアドレスじゃないフォーマットの文字列が入ったりするのをバリデーションを挟むことで防いでくれます。

俺「バリデーションってなんやねん」

という方はこちらの記事も参考にしてみてください。

(準備1)routeの設定しよう

ここからは実際に簡単なLaravelのアプリを作成しながら、バリデーションの流れを見ていきましょう(ここからは主にドキュメントの内容)。

まずは投稿用のフォーム画面を表示するrouteとその投稿を追加するrouteをweb.phpに作成しましょう。

web.php
use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);

Laravelが初めての方に説明すると、2行目のGETメソッドで投稿用のフォーム画面を表示するrouteで、POSTメソッドはそれをDBに追加するためのrouteです。

(準備2)Controllerを作成しよう

次は受け取ったデータを扱うためのコントローラーを作成しましょう!

一旦storeメソッドは空のままにしておきます。

PostController.php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /* 投稿を作成するフォームを表示する */
    public function create()
    {
        return view('post.create');
    }

    /* 投稿を追加する */
    public function store(Request $request)
    {
        // バリデーションしてからデータを追加する
    }
}

ざっとこんな感じですね。

【本題!】バリデーションを書こう

ここまで準備できたら、早速storeメソッドの中にバリデーションするロジックを書いていきましょう!

Laravelでバリデーションを実装にはRequestオブジェクトが提供するvalidateメソッドを使いましょう。

バリデーションは通過したら処理は継続して実行され、失敗すると直前の画面に返されます。

バリデーションはこんな感じになります。

PostController.phpのstore()
$request->validate([
    'title' => ['required', 'unique:posts', 'max:255'],
    'body' => ['required']
]);

ご覧の通り、バリデーションルールはvalidateメソッドに渡されています。

繰り返しになりますが、バリデーションは失敗するとそれ以降の処理をしなくなります。成功すれば、コントローラーの処理を引き続き行います。

(発展編)エラー内容を画面に表示しよう!

もし入力されたデータがバリデーションに引っかかったらどうしましょうか。

そんなときはエラーメッセージを表示して、ユーザーに「どの要素がダメだったか」を知らせてあげましょう。

俺「エラーメッセージってなんやねん」

という方はご安心を、下記ページからエラーメッセージが何かを学ぶことができます👍

「もう知ってるよ」という方は下記を飛ばしていただいてOKです。

エラーメッセージを実装しよう

途中でお伝えした通り、Laravelではvalidationに引っかかった場合には自動的に直前のページにリダイレクトされます。

(さらに専門的なことを言うと、全てのバリデーションエラーとリクエストの入力は自動的にセッションに一時的に保持されます。)

Laravelでは$errorsという変数がWebアプリのviewで共通で使えるようになっています(厳密にいうとwebmiddlewareが適用されているときですが、一旦は大体のときで使えるって思ってもらってOK)。

Laravelではvalidationに引っかかったとき、この$errors変数にエラーメッセージが格納されます。

これによって、バリデーションに引っかかって直前のページにリダイレクトしたときに、以下のようなにしてエラーメッセージを表示することが可能です。

post/create.blade.php
<h1>投稿する</h1>

@if ($errors->any()) <!-- エラーがあるとき --->
<ul>
    @foreach ($errors->all() as $error) <!-- 全てのエラーをループ文で表示する --->
        <li>{{ $error }}</li>
    @endforeach
</ul>
@endif

こんな感じで実装すると、バリデーションを実装してかつ問題があった箇所のエラーメッセージを表示することができます!

以上っ!!!

余談

ちなみに筆者はスラムダンクを全く読んだことがありません。

昔に流行ったDSのゲームJUMP ULTIMATE STARSに登場したコマを読んだことがあるくらいです。

大参考記事

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?