LoginSignup
0
0

More than 3 years have passed since last update.

【Laravel】フォームリクエストでバリデーションをしよう

Posted at

入力フォームやクエリパラメータをフォームリクエストでバリデーションする方法について解説します。

フォームリクエスト作成

まず、フォームリクエストを作成します
ターミナルから下記のコマンドで作成しましょう
下記のコマンドでapp/Http/Requests/ディレクトリにSampleRequest.phpという名前のRequestクラスを作成できます

ターミナル
php artisan make:request SampleRequest

SampleRequestクラスについて

作成されたSampleRequestクラスで確認しましょう
SampleRequestクラス内にauthorizeメソッドとrulesメソッドができていると思います

rulesメソッドはバリデーションの規則を定義する

下記のようにrulesメソッドを定義すると、titlebodyそれぞれに対して下記のような条件を設定しています。
title カラムには必須、postテーブル内での一意性、最大文字数を255に設定しています。
bodyカラムには必須条件を設定しています
他の条件については公式ページのバリデーションのページを参考に設定してみてください

app/Http/Requests/SampleRequest.php
public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

authorizeメソッドはフォームリクエストの使用できる条件を定義

ビューから送信されるURLの設定

保存処理を行うアクションへのURLを下記のように設定している場合を考えています

Route::post('comment/{comment}');

authorizeメソッドの説明

authorizeメソッドはユーザーが、指定されたデータを更新する権限を持っているのかを確認します。
下記のコードでは、ユーザーが更新しようとしているブログコメントを所有しているかを確認します。

app/Http/Requests/SampleRequest.php
public function authorize()
{
    $comment = Comment::find($this->route('comment'));

    return $comment && $this->user()->can('update', $comment);
}

常に判定に成功する場合

もし、権限判定を他の場所でしている、または権限判定が不要な場合は、
下記のように返り値をtrueにして常に判定が通るようにしてください。

app/Http/Requests/SampleRequest.php
public function authorize()
{
    return true;
}

上記の設定でリクエストでバリデーションを使用することができます!!

フォームリクエストの使い方

フォームから送信された値、クエリパラメータを使用する時はコントローラーアクション引数にRequestクラスのインスタンスを設定すると思います。
そこのクラス名を今回独自で設定したSampleRequestを指定してください。
そうするとインスタンス$requestを作成する時に自動でバリデーションをかけてくれます。

コントローラー.php
public function store(SampleRequest $request)
{
    // 送信されたリクエストが正しい場合実行される
}

バリデーションに失敗すると、前のアドレスにユーザーを戻します。
その時に、エラーメッセージも表示できるように、フラッシュデーターとしてセッションに保存されます。

エラーメッセージのカスタマイズ

上記の設定のままではエラーメッセージはデフォルトのままです。
英語で表示され、ユーザーに対して優しい設定とは言えません。
より具体的にエラー内容を設定しましょう
messagesメソッドでメッセージの配列を設定しましょう。

app/Http/Requests/SampleRequest.php
public function messages()
{
    return [
        'title.required' => 'タイトルは必須項目です',
        'body.required'  => '内容は必須項目です',
    ];
}

以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0