見出し画像

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いただけると喜びます!

読んでいただきありがとうございます。