では、前回の記事に引き続き、今度はフォームリクエストを使ってバリデーションを実装してみたいともいます。もし、前回の記事をご覧になっていない方がいたら、ぜひご覧ください。
バリデーションしてみる ~ フォームリクエスト編 ~
まだ実装していませんが、ブログアプリならば、入力された値をデータベースに保存するという処理が必要です。その処理もコントローラに書いていくわけですが、そうなると、コントローラに「データを保存する処理」と「バリデーション」が混在してしまうわけです。それは後々、アプリ内の処理が増えてくると、デバッグが大変そうです。そんな時に見つけたのが、フォームリクエストによるバリデーションです。フォームリクエストは、コントローラが呼び出される前に、バリデーションをおこなってくれます。つまり、以下のような順番で処理が走るということです。 良さそうですね、、!
1. フォームリクエストファイルを作る
手動でもファイルは作れますが、コマンドを使うと簡単です。
php artisan make:request [作りたいフォームリクエストの名前]
私は、php artisan make:request PostValidationRequest
と打ってPostValidationRequest.php というファイルがapp/Http/Requests の中に自動生成されます。中身は下のような感じです。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PostValidationRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
//
];
}
}
フォームリクエストを使う時に必要なメソッドも自動で用意してくれます。とっても便利ですね。ファイルの中には、authorize()
とrules()
という2つのメソッドがあります。コメントを読むと、authorize()
がユーザーがフォームリクエストを利用できるかどうかの判別をするメソッドで、rules()
がバリデーションルールを追加するメソッドであることがわかります。
2. バリデーションルールを追加
rules()
の返り値の中に、バリデーションルールを追加してみます。今回は、タイトルのバリデーションの処理をフォームリクエストに移動させてみます。タイトルのバリデーションルールは、「文字列」かつ「5文字以上」でした。コントローラに書いた配列の値をそのままrules()に移動させます。こんな感じになりました。
public function rules()
{
return [
'title' => 'string|min:5'
];
}
ただそのままだと使えません。フォームリクエストに書いたバリデーションを使うためには、コントローラで、フォームリクエストファイルをインポート(use use App\Http\Requests\PostValidationRequest; )して、使いたいメソッドの引数で、タイプヒンティングでPostValidationRequestを指定します。これは、ブラウザから送られてくるrequestにPostValidationRequestでの処理も載せられて、コントローラのcreateメソッドに届けられているということで理解をしました。(ただ自信はないので、もしずれていた場合は、どなたか教えていただきたいです…!)
use App\Http\Requests\PostValidationRequest;
<省略>
public function create(PostValidationRequest $request)
{
$request->validate([
// バリデーションルールを入れる
'post_contents' => 'string|required '
]);
}
じゃあ、バリデーションに引っ掛らせるぞ!と空欄で押してみます。すると、以下のようなエラーが出ます。403エラーです。
横のエラー文を読むと「THIS ACTION IS UNAUTHORIZED(この行為は許可されていません)」と書かれています。UNAUTHORIZED..?どこかでみた英単語ですね。先程のフォームリクエストの中のauthorize()が怪しそうです。ということで、authorize()でfalseではなく、trueで返してあげます。
すると、無事エラーがでてきました。ただ、コントローラで動かしているはずのvalidateメソッドが動いてません、、少し調べたけれど、原因がうまくわからなかったので、今後の宿題にさせてください….
3. オリジナルのエラーメッセージを表示させる
参考ページによると、フォームリクエストを使ったバリデーションのエラーメッセージは、message
メソッドを上書きすることでできるようです。‘「フォームのname属性」.「対応するルール」’ => ‘エラーメッセージ’ で配列にして返すことで、オリジナルのエラーメッセージが作成できます。日本語になりました!!!
public function messages()
{
return [
'title.string' => 'タイトルは文字列です',
'title.min' => 'タイトルは5文字以上です'
];
}
はい!ということで今回は、Laravelのフォームリクエストを使ってバリデーションをしてみました!また次の記事でお会いしましょう!
参考
前回 の記事と同じページ(フォームリクエストバリデーションの項)を参考にさせていただきました!ありがとうございました!
コメント