LaravelのValidateの使い方を調べてみた:その2
こんにちは、システムエンジニアの今井です。
前回のブログでLaravelのValidateで「Validatorクラスを使う方法」を紹介しました。
今回は「Requestクラスのvalidateメソッドを使う方法」を紹介します。
※:今回の内容はほぼ前回のブログと内容が似ています。
前回のブログとは「⑥:app/Http/Controllers/HogeController.php を編集」の箇所が異なります。
前回のブログを既に閲覧している場合は「⑥:app/Http/Controllers/HogeController.php を編集」の箇所のみ見ていただければと思います。
今回紹介するValidation条件例として、前回と同じく以下4つのPOST値をチェックする前提で説明します。
email:必須、email形式
name:必須、255文字以内
title:任意、255文字以内
message:任意、1000文字以上、6000文字以内
環境情報
CentOS 7.7.1908
PHP 7.3.11
Laravel 6.4.0
composer 1.9.1
それでは、「Requestクラスのvalidationメソッドを使う方法」について紹介したいと思います。
①:Laravel自体を作成
composerを使って以下のコマンドを叩くと、実行したコマンドのカレントディレクトリにlaravel_sampleというディレクトリが作成されます。
composer create-project "laravel/laravel=6.4.0" --prefer-dist laravel_sample
②:HogeController.php の作成
※:以下の作業を行うとapp/Http/Controllers配下にHogeController.phpが作成されます。
cd laravel_sample php artisan make:controller HogeController
③:routes/web.php を編集
以下の設定で
/hogeのURLを開いた時にHogeControllerのindexアクションを呼び出します。
/hogeのURLにPOST通信したときにHogeControllerのpostアクションを呼び出します。
Route::get('hoge', 'HogeController@index');
Route::post('hoge', 'HogeController@post');
④:resources/view/hoge/index.blade.php の作成
/hogeのURLを開いた時に表示されるHTMLになります。
Bootstrap4.3.1を使っています。
{{old(‘xx’)}}はvalidationでエラーになった時に直前に入力していた値を表示します。
$errorsの箇所はエラーメッセージを表示します。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, width=device-width">
<title></title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div class="container">
<form action="/hoge" method="post">
{!! csrf_field() !!}
<div class="form-group">
<label for="email">email:</label>
<input type="text" name="email" id="email" class="form-control" value="{{old('email')}}">
@if ($errors->has('email'))
<span class="text-danger">{{$errors->first('email')}}</span>
@endif
</div>
<div class="form-group">
<label for="name">name:</label>
<input type="text" name="name" id="name" class="form-control" value="{{old('name')}}">
@if ($errors->has('name'))
<span class="text-danger">{{$errors->first('name')}}</span>
@endif
</div>
<div class="form-group">
<label for="title">title:</label>
<input type="text" name="title" id="title" class="form-control" value="{{old('title')}}"/>
@if ($errors->has('title'))
<span class="text-danger">{{$errors->first('title')}}</span>
@endif
</div>
<div class="form-group">
<label for="message">message:</label>
<textarea name="message" id="message" class="form-control">{{old('message')}}</textarea>
@if ($errors->has('message'))
<span class="text-danger">{{$errors->first('message')}}</span>
@endif
</div>
<button class="btn btn-primary" type="submit">Submit form</button>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>
⑤:resources/view/hoge/post.blade.php の作成
このファイルはvalidateを通過した時に表示されるページになります。POSTしたデータの内容が表示されます。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div>
POST成功
<table>
<tr>
<td>email</td>
<td>{{$validated['email']}}</td>
</tr>
<tr>
<td>name</td>
<td>{{$validated['name']}}</td>
</tr>
<tr>
<td>title</td>
<td>{{$validated['title']}}</td>
</tr>
<td>message</td>
<td>{{$validated['message']}}</td>
<tr>
</table>
</div>
</body>
</html>
⑥:app/Http/Controllers/HogeController.php を編集
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HogeController extends Controller
{
public function index()
{
return view('hoge.index');
}
public function post(Request $request)
{
$rules = [
'email'=> 'required|email', // emailフィールドは必須チェック、emailの形になっているかチェックを行う
'name' => 'required|max:255', // nameフィールドは必須チェック、255文字以内かをチェックする
'title' => 'nullable|max:255', // titleフィールドは任意入力、入力があった時は255文字以内かをチェックする
'message' => 'nullable|min:1000|max:6000', // messageフィールドは任意入力、入力があった時は1000文字以上かつ6000文字以内かをチェックする
];
$messages = [
'email.required' => 'メールアドレスを入力してください。', // emailフィールドで入力がなかった時に表示されるエラーメッセージ
'email.email' => '正しいメールアドレスを入力してください。', // emailフィールドで正しいemail形式でなかった時に表示されるエラーメッセージ
'name.required' => '名前を入力してください。', // nameフィールドで入力がなかった時に表示されるエラーメッセージ
'name.max' => '名前は:max文字以内で入力してください。', // nameフィールドで255文字を超えた時に表示されるエラーメッセージ
'title.max' => 'タイトルは:max文字以内で入力してください。', // titleフィールドで255文字を超えた時に表示されるエラーメッセージ
'message.min' => 'メッセージは:min文字以上で入力してください。', // messageフィールドで1000文字未満の時に表示されるエラーメッセージ
'message.max' => 'メッセージは:max文字以内で入力してください。', // messageフィールドで6000文字を超えた時に表示されるエラーメッセージ
];
$validated = $request->validate($rules, $messages);
return view('hoge.post')->with(['validated'=>$validated]);
}
}
⑦からは①~⑥で作成したものを動かしてみたいと思います。
⑦:以下のコマンドで 8000番ポートにアクセスできるようにします。
php artisan serve --host 0.0.0.0
⑧:ブラウザで8000番ポートで/hogeにアクセスします
⑦のコマンドを行ったサーバのIPアドレスが192.168.1.30として以下のURLでアクセスします。
http://192.168.1.30:8000/hoge
注)サーバで8000番ポートがiptablesやfirewalld等で閉じている場合は、あらかじめ開けておいてください。
以下のようなフォームが表示されます。

⑨:空っぽでSubmitボタンを押してみます
メールアドレスと名前の箇所は必須入力ですので、この2つでエラーが表示されました。

⑩:その他のエラーを出してみる
メールアドレスにふさわしくない形、名前に255文字以上、タイトルに255文字以上、メッセージに1000文字未満をいれてSubmitしてみます。条件に合わないのでエラーが表示されます。

⑪:正しい内容の値を入力しvalidateを通過してみます
以下のように正しい内容の値を入れてSubmitします。

Submitするとpost.blade.phpの内容が表示され、validateを通過することが確認できました。

まとめ
LaravelのRequestクラスのvalidateメソッドを使うことで、入力内容のチェックがすることができました。
簡単なValidateを行うだけであれば、この方法で問題ないかと思います。
ただ、チェックする項目が多くなるとController内にvalidateするために記述内容が増え、Controllerが肥大化してきます。
validateする処理を外部ファイル化しControllerの肥大化を防ぐために次回は「Requestクラスを継承して使う方法」を紹介できればと思います。