前回は、Form を作成して Articles テーブルにデータを追加しましたが、入力データのチェックを行っていませんでした。今回はこの入力データのチェックを実装してみます。
Controller
Form で入力されたデータを保存している、store メソッドを修正します。
<?php // app/Http/Controllers/ArticlesController.php namespace AppHttpControllers; use App\Article; use App\Http\Controllers\Controller; use Illuminate\Http\Request; // ①' class ArticlesController extends Controller { // ... public function store(Request $request) { // ① $rules = [ // ② 'title' => 'required|min:3', 'body' => 'required', 'published_at' => 'required|date', ]; $validated = $this->validate($request, $rules); // ③ Article::create($validated); return redirect('articles'); } }
①リクエストの取得方法を変更しました。
前回は \Requestファサードを使って、リクエストにアクセスしましたが、今回は store メソッドの引数から Illuminate\Http\Request クラスのインスタンスを取得するようにしました。
Laravel のコントローラはメソッドの引数にタイプヒントでクラスを記述すると、そのクラスのインスタンスを自動生成して渡してくれます。とてもクールです。
②バリデーションルールを設定しています。
バリデーションルールの詳細は公式ドキュメントを参照してください。
https://laravel.com/docs/5.6/validation#available-validation-rules
③コントローラの validate() メソッドを実行しています。
ここでエラーがあると、自動的に前の画面にリダイレクトしてくれます。これまたクールです。
View
Form画面にエラー表示を追加ます。
$errors にエラーメッセージが複数格納されるので、@foreach を使って件数分表示しています。
// resources/views/articles/create.blade.php @extends('layout') @section('content') <h1>Write a New Article</h1> <hr/> {{-- エラーの表示を追加 --}} @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif {!! Form::open() !!} ... {!! Form::close() !!} @endsection
動作確認
- http://localhost:8000/articles/create にアクセス
- Formに入力しないで、Add Article ボタンを押下
- エラーメッセージが表示されれば、成功です
念の為、全ての項目を入力し正常に記事が登録されることも確認してください。
まとめ
入力値のチェックとエラーの表示ができるようになりました。