みなさん、こんにちは、最近はハンバーグ作りが趣味になりつつあるt-odaです。

前回は、ビュー周りについてでしたね。うまく表示できていればタスク名を入力する欄と追加ボタンがあると思います。今回の目標はタスク登録とバリデーションとエラー処理です。このチュートリアルのミソになりますね。

また、ミソなだけあって結構エラーを吐くかもしれないですがエラー内容をちゃんと理解するようにしましょう。上達のコツはエラー君と仲良くすることです。僕はエラー君とはとても仲がいいですよ!

リクエストを受け取る

最初に処理の流れを確認しましょう。

  • POSTで/taskにアクセス
  • リクエストを受け取りバリデーション
  • エラーがあればエラーメッセージを格納
  • エラーがなければ登録
  • 一覧画面へリダイレクト

とても簡単だということがわかると思います。そして、以下が今回の書き換えたroute.phpになります。

最初はリクエストを送信するんですが、POSTで通信するのでformタグのmethod属性はもちろんPOSTですね。 また、どのURIに対して送信するのかということですが、通常はformタグのaction属性で指定します。これを省略すると、現在のURIに対して送信することになります。今回はaction="/task"となりますね。これらは第3回の記事で書いたと思います。

そして、前回も言いましたがCSRF対策のためのトークンは必ず埋め込んでください。当然エラーになります。

次に、リクエストを受け取ってみましょう。リクエストの受け取り方は多種多様なのでお好きな方法で受け取ってください。以下がその方法になります。

  • DI
  • Requestファサード
  • Inputファサード

多種多様とは言ったものの3種類しかあげられませんでした。この中でよく使うのはDIでしょうか。タイプヒントにクラスを指定すればnewせずともそのインスタンスを取得できる、というイメージで問題ないです。難しいとは思いますが、Laravelは特に意識することなく使えるので便利なんですよね。これについては多くの方が議論していると思うので、Qiitaなどで検索することをお勧めします。

以下のようにすることで$requestにはRequestのインスタンスが入っています。簡単ですね。

あらかじめdd($request->all());を記述しておき実際にタスク名を入れて追加ボタンを押してください。$request->all()は送信された値すべてを配列で取得するメソッドで、dd()で表示しスクリプトを停止しています。今回の場合は_tokenとnameが表示されると思います。

バリデーション

リクエストを受け取ったらバリデーションをしましょう。

make()がインスタンスを生成します。また、makeの第1引数がバリデーションの対象、第2引数がバリデーションのルールになります。

  • Validator::make()の第1引数:バリデーションを受ける値(配列)
  • Validator::make()の第2引数:バリデーションルール

バリデーションのルールはどんなフィールドに対してどのようなルールを適用させるかという書き方をします。この場合だと、nameフィールドに対して必須項目かつ最大255文字というルールを適用しています。他にもルールはたくさん用意されています。一度見ておくといいでしょう。ルールが記載されているファイルは/resources/lang/en/validation.phpになります。

デフォルトは英語表記なので日本語用にディレクトリを作りましょう。enディレクトリをコピーしてjaディレクトリを作ります。

この/resources/lang/ja/のファイルを読み込むようにするためにconfig/app.phpのlocaleをjaに設定します。これでjaディレクトリ以下を参照するようになります。ちなみに、fallback_localeはlocaleで参照するディレクトリが見つからないときに参照するのでenのままにしておきます。

さて、バリデーションに失敗した時の処理を書かないといけないですね。次のコードになります。

$validatorにはValidatorインスタンスが格納されています。このインスタンスはfails()というメソッドをもっており、これはバリデーションに失敗すればtrueが戻り値となります。なので、if ($validator->fails()) { }とすることで失敗の時の処理が書けます。

失敗した時の処理は「以前の入力値とエラーメッセージをフラッシュセッションにいれてリダイレクトする」となります。フラッシュセッションとは1回の通信だけ有効なセッションのことです。redirect()に続けてwithInput()withErrors()をチェーンメソッドにしています。withErrorsは引数にValidatorクラスのインスタンスを指定しましょう。

  • withInput():ユーザーが入力した値
  • withErrors():バリデーションエラーのメッセージで引数にインスタンスを指定

登録

バリデーションに成功した場合はデータベースに登録します。まずは、Taskモデルのインスタンスを生成します。次にこのモデルがもつnameにリクエストのnameを格納します。最後にsave()を実行し一覧画面へリダイレクトで完了です。特に問題はなさそうですね。

タスク一覧表示の部分を作ってないのでさくっと作りましょう。tasks.blade.phpに次の部分を追加します。

登録が終わればあとはタスク名の取得と表示ですね。Route::get() { }でタスクの情報を取得しビューに渡しています。

またorderBy()で取得時の並び順の指定ができ、get()で全件を取得しています。orderBy()は第1引数にカラム名、第2引数に昇順か降順かを指定します。今回の場合は作成日(created_at)を昇順(asc)で全件取得(get())しているので新しくタスクを追加すると下に表示されていきます。ちなみに、第2引数を省略した場合はascになります。

  • orderBy()の第1引数:カラム名
  • orderBy()の第2引数:asc(昇順)かdesc(降順)でascは省略可

次回予告

いかがでしょうか?思った以上に簡単だったと思います。次回は削除処理とちょっとした動きをつけたいと思います。この動きは公式のチュートリアルで紹介されているものではなく僕の完全な遊び心です!