Laravel 5.7 でバリデーションを実装する方法
Laravel 5.7にてコンテンツ投稿時にバリデーション機能を実装する方法を記載します。
今回やること
・FormRequest クラスの作成
・PostControllerの修正
・エラーメッセージを表示させる
・エラーメッセージを日本語化する
前提
・Laravelが動く環境がすでにあること
・投稿フォームが作成されていること。(詳しくはこちら)
・Laravel のバージョンは5.7
※例ですが、すでにこのような投稿フォームができていることが前提となります。
今回の完成動画デモはこちらです。
それでは始めます。
--- 🖥 ---
FormRequest クラスの作成
Laravelでバリデーション機能を作成する場合は、FormRequest クラスを作成します。下記実行します。
php artisan make:request CreatePost
すると、「app/Http/Requests」ディレクトリに「CreatePost.php」というファイルが作成されます。
次に、この作成されたCreatePost.phpを修正していきます。
まずはauthorize()の箇所を修正します。
public function authorize()
{
return true; //trueに修正
}
デフォルトでは「return false;」となっている箇所を「return true;」に変更します。
次に、rules()を修正します。今回はタイトルを必須フィールドにするように修正します。
public function rules()
{
return [
'title' => 'required',
];
}
「title」の部分はinputのname属性に対応します。また、必須の場合は「required」と記入します。
※今回はタイトルが「<input name="title" value="">」と記載してるので「title」になります。
以上でFormRequestクラスの設定が完了です。
最後に、作成したCreatePost.phpを全文を下記に記載します。
・CreatePost.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CreatePost extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required',
];
}
}
PostControllerの修正
次に、先ほど作成したバリデーションを有効にするためにコントローラーを修正します。まずはCreatePostをインポートする設定を記載します。
use App\Http\Requests\CreatePost;
次に、createメソッドの引数を「CreatePost」に修正します。
public function create(CreatePost $request)
こちらの引数に「CreatePost」を指定することで、バリデーションを追加することができます。
最後に、PostCOntroller.phpの全文を下記に記載します。
・PostCOntroller.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\CreatePost;
class PostController extends Controller
{
public function showCreateForm()
{
return view('posts/create');
}
public function create(Request $request)
{
// Postモデルのインスタンスを作成する
$post = new Post();
// タイトル
$post->title = $request->title;
//コンテンツ
$post->content = $request->content;
//登録ユーザーからidを取得
$post->user_id = Auth::user()->id;
// インスタンスの状態をデータベースに書き込む
$post->save();
//「投稿する」をクリックしたら投稿情報表示ページへリダイレクト
return redirect()->route('posts.detail', [
'id' => $post->id,
]);
}
/**
* 詳細ページ
*/
public function detail(Post $post)
{
return view('posts/detail', [
'title' => $post->title,
'content' => $post->content,
'user_id' => $post->user_id,
]);
}
}
エラーメッセージを表示させる
次にエラーメッセージの表示設定を行います。エラーメッセージの表示設定はviewにて行います。今回は投稿フォーム用のbladeファイル、「resources/views/posts/create.blade.php」を修正します。
formタグの前に下記追記します。
@if($errors->any())
<div class="error">
<ul>
@foreach($errors->all() as $message)
<li>{{ $message }}</li>
@endforeach
</ul>
</div>
@endif
■↑のポイント
・$errors:エラー内容が格納されます。
・foreach:エラーが複数ある場合、foreachで複数表示します。
必須フィールドに値が入力されていない状況で「投稿する」をクリックすると、エラーが表示されるようになります。
以上でエラー表示の設定が完了です。
ここまでで実際にタイトルを記入しないで投稿してみると、下記のようにエラーメッセージが表示されます。
「・The title field is required.」と英語でメッセージが表示されています。デフォルトでは英語の表記となりますので、次に日本語化する対応を行います。
エラーメッセージを日本語化する
それではエラーメッセージを日本語化します。
メッセージは「resources/lang」ディレクトリ内で管理されています。デフォルトでは「en」ディレクトリしか存在しないので、ここに「jp」ディレクトリを作成します。
また、enディレクトリ内の「validation.php」を先ほど作成したjpディレクトリにコピーします。下記のような構造になります。
コピーしたvalidation.phpを修正します。今回は「'required'」のみ修正します。
'required' => ':attribute フィールドは必須項目です。',
:attribute で項目が表示されます(今回の場合は「タイトル」が入ります)。
次に今作成した日本語のファイルを読み込むようにconfigを修正します。「config/app.php」を開き「'locale' => 'en',」と書いている箇所を下記のように修正します。
'locale' => 'jp',
これでデフォルトでjpディレクトリを参照するようになります。
※余談ですが、「'locale' => 'jp',」の下に「'fallback_locale' => 'en',」と記載されていると思います。これはデフォルトではjpを見に行くが、jpディレクトリにファイルがない場合はenディレクトリを見にいくという設定になります。
もう一度ブラウザからエラーメッセージを確認すると。。
このように日本語に変更されました。
しかしまだ「title」が英語のままなので、こちらも日本語化します。こちらのカスタマイズは、最初に作成したCreatePost.phpにて対応します。
CreatePost.phpに下記メソッドを追加します。
public function attributes()
{
return [
'title' => 'タイトル',
];
}
ここまでできたらもう一度ブラウザよりエラーメッセージを確認します。
このようにすべて日本語化されました。
ということで以上でバリデーションの対応は完成です。
今回は説明していないですが、こちらを応用して
・文字数制限をする
といったことも対応できるようになります。
GitHubリポジトリ
今回作成したソースはGithubにて公開しています。下記リンクよりご確認ください。(lerning-3ブランチです。)
https://github.com/KoushiKagawa/laravel-learning/tree/learning-3
間違いや、もっとこう書いた方が良いよ!といったご指摘はコメント欄かtwitterのDMいただけると喜びます!
読んでいただきありがとうございます。