安西先生「諦めたら、そこで堅牢なWebサイトの終了ですよ」
冗談は縦置き、さっそく本題です。
validate
メソッドを使おう
こちらの記事はLaravelドキュメントのバリデーションの部分の最低限の機能を分かりやすいようにかみ砕いたものになります。
「ドキュメントの表現が堅苦しくて分からないよ~」って方には丁度いいかと思います👍
それでは表題通り、Laravelでバリデーションを実装する方法をご紹介しましょう。
一番簡単なのはRequestオブジェクトが提供しているvalidate
メソッドを使うことです。
今回はこちらを紹介します。
バリデーションって美味いん?
美味くはないですが、機能的にはかなり旨いです😋(全然上手いこと言えてない)
おさらいですが、バリデーションは「入力されたデータのフォーマットが正しいかを検証する」機能です。
入力必須の項目が空欄だったり、年齢のところに日本語が入ったり、メールアドレスのところにメールアドレスじゃないフォーマットの文字列が入ったりするのをバリデーションを挟むことで防いでくれます。
俺「バリデーションってなんやねん」
という方はこちらの記事も参考にしてみてください。
(準備1)routeの設定しよう
ここからは実際に簡単なLaravelのアプリを作成しながら、バリデーションの流れを見ていきましょう(ここからは主にドキュメントの内容)。
まずは投稿用のフォーム画面を表示するrouteとその投稿を追加するrouteを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
メソッドは空のままにしておきます。
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
メソッドを使いましょう。
バリデーションは通過したら処理は継続して実行され、失敗すると直前の画面に返されます。
バリデーションはこんな感じになります。
$request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required']
]);
ご覧の通り、バリデーションルールはvalidate
メソッドに渡されています。
繰り返しになりますが、バリデーションは失敗するとそれ以降の処理をしなくなります。成功すれば、コントローラーの処理を引き続き行います。
(発展編)エラー内容を画面に表示しよう!
もし入力されたデータがバリデーションに引っかかったらどうしましょうか。
そんなときはエラーメッセージを表示して、ユーザーに「どの要素がダメだったか」を知らせてあげましょう。
俺「エラーメッセージってなんやねん」
という方はご安心を、下記ページからエラーメッセージが何かを学ぶことができます👍
「もう知ってるよ」という方は下記を飛ばしていただいてOKです。
エラーメッセージを実装しよう
途中でお伝えした通り、Laravelではvalidationに引っかかった場合には自動的に直前のページにリダイレクトされます。
(さらに専門的なことを言うと、全てのバリデーションエラーとリクエストの入力は自動的にセッションに一時的に保持されます。)
Laravelでは$errors
という変数がWebアプリのviewで共通で使えるようになっています(厳密にいうとweb
middlewareが適用されているときですが、一旦は大体のときで使えるって思ってもらってOK)。
Laravelではvalidationに引っかかったとき、この$errors
変数にエラーメッセージが格納されます。
これによって、バリデーションに引っかかって直前のページにリダイレクトしたときに、以下のようなにしてエラーメッセージを表示することが可能です。
<h1>投稿する</h1>
@if ($errors->any()) <!-- エラーがあるとき --->
<ul>
@foreach ($errors->all() as $error) <!-- 全てのエラーをループ文で表示する --->
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
こんな感じで実装すると、バリデーションを実装してかつ問題があった箇所のエラーメッセージを表示することができます!
以上っ!!!
余談
ちなみに筆者はスラムダンクを全く読んだことがありません。
昔に流行ったDSのゲームJUMP ULTIMATE STARSに登場したコマを読んだことがあるくらいです。
大参考記事