5
3

More than 3 years have passed since last update.

[Laravel] FormRequestまとめ

Last updated at Posted at 2021-08-22

はじめに

基本含め、現場でよく使う関数をまとめたいと思います。
Laravelのバージョンは7.30.4です。

目次

  • rules()
  • attributes()
  • messages()
  • validationData()
  • prepareForValidation()
    • replace()
    • merge()
  • withValidator()

rules()

バリデーションルールを定義する関数です。

app/Http/Requests/Example.php
public function rules()
{
    return [
        'name' => 'required|max:30',
    ];
}
<input name="name" value="">

name属性の値である"name"フィールドに対して

  • 必須(required)
  • 最大30文字(max:30)

というバリデーションルールを定義しているということになります。

attributes()

バリデーション属性のカスタマイズを行う関数です。
例えば、名前を入力するフォームがあったとします。
名前が必須項目である時、空文字のまま送信した場合、以下のようなエラーメッセージが出ました。
スクリーンショット 2021-08-16 10.47.35.png
この"name"は

<input name="name" value="">

name属性の値である"name"です。
しかし、ほとんどの場合、"name"ではなく、項目名ここでは「名前」をエラーメッセージで出力したいと思います。
そのときに使うのが、このattributes()です。

app/Http/Requests/Example.php
public function attributes()
{
    return [
        'name' => '名前',
    ];
}

すると、
スクリーンショット 2021-08-16 11.02.00.png
"name"が"名前"に変わり、項目名と一致させることができました!
「次はメッセージを修正したいんだけど?」って思いますよね。
そこで使うのが次に紹介するmessages()です。

messages()

エラーメッセージのカスタマイズを行う関数です。
先ほどの"The 名前 field is required"を修正していきたいと思います。

app/Http/Requests/Example.php
public function messages()
{
    return [
        'name.required' => '名前は必須です。',
    ];
}

このように「フィールド名.ルール」と書くことで、
スクリーンショット 2021-08-16 11.36.03.png
となります。
またattributes()でカスタマイズしたバリデーション属性、ここでは"名前"をリテラルではなく、変数のように扱いたい場合は

app/Http/Requests/Example.php
public function messages()
{
    return [
        'name.required' => ':attributeは必須です。',
    ];
}

":attribute"を用います。
このようにすれば、attributes()でカスタマイズしたバリデーション属性を修正した場合でも、messages()を修正する必要がないので大変便利です。

validationData()

POSTデータの取得を行う関数です。

Illuminate/Foundation/Http/FormRequest.php
public function validationData()
{
    return $this->all();
}

お馴染みの$this->all()です。

prepareForValidation()

バリデーション前に何らかの処理を行っていることを示す関数です。
POSTデータの加工で私はよく使用しています。
POSTデータの加工には、置換を行うreplace()新たなデータを追加するmerge()などがあります。
対称的に、バリデーション後に何らかの処理を行うことを示すpassedValidation()という関数もあります。

replace()

app/Http/Requests/Example.php
protected function prepareForValidation()
{
    $data = $this->validationData();

    if($data['send1'] == ''){
        // 置換後のデータ
        $data['send1'] = 'replaced';
    }

    $this->replace($data);
}

のようにしてデータの置換を行うことができます。

merge()

app/Http/Requests/Example.php
protected function prepareForValidation()
{
    $data = $this->validationData();
    // 追加したいデータ
    $data['add'] = 'added value';

    $this->merge($data);
}

のようにして新たなデータの追加を行うことができます。

withValidator()

自作のバリデーションを適用させたいときに用いる関数です。

app/Http/Requests/Example.php
public function withValidator($validator)
{
    /**
     * すでにバリデーションエラーがある場合に
     * 自作のバリデーションを適用させたくない時はこれを追加してあげる
     */ 
    if ($validator->fails()) {
        return;
    }

    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'エラーメッセージ');
        }
    });
}

まとめ

コードを追いかけてみると、フォームリクエストにはたくさんの関数があることがわかるので、積極的に既存の関数を活用していきましょう!!!

5
3
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
5
3