0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【laravel8】FormRequestの実装

Posted at

FormRequestに書くメリット

FormRequestに記載するメリットとしては以下の点がある
・Controllerに書くコード量が少なくなる、見やすくなる。
・ロジックを分けることができる

FormRequestの作成方法

以下のコマンドを実行するとapp/Http/RequestsディレクトリにFormRequestファイルが配置される。

$ php artisan make:request 任意のファイル名

ポイント
・命名は「アクション名+コントローラー名」とする。
PostControllerのstoreメソッドで使用したい場合は以下のように命名する。

$ php artisan make:request StorePostRequest

FormRequestの設定

・今回はバリデーションのルールとメッセージだけ設定していく。

class StorePostRequest extends FormRequest
{
    // 認可条件を設定
    public function authorize()
    {
        return true;  // 認可します
    }
    // ルールを記述
    public function rules()
    {
        return [];
    }
    // メッセージ
    public function messages()
    {
        return [];
    }
}

一つ一つ見ていく。

authorize()
・認可すべき条件があれば記述しtrue/falseを返す。
・特になければtrueを返しておかないとレスポンスは403Forbiddenとなる。

    // 認可条件を設定
    public function authorize()
    {
        return true;  // 認可します
    }

rules()
・バリデーションのルールを指定
・ルールを配列もしくは|で繋げて指定する

    // ルールを記述
    public function rules()
    {
        return [
            //ルールを|で繋げる場合
            "title" => 'required|string|max:100',
            "mail"  => 'required|string|max:100',

            //ルールを配列で指定する場合
            "title" => ['required','string','max:100'],
            "mail"  => ['required','string','max:100'],

            //group = [
            //  [
            //     "name" => '中田',
            //     "age"  => 22,
            //  ],
            //  [
            //     "name" => '山田',
            //     "age"  => 22,
            //  ],
            //  [
            //     "name" => '山田',
            //     "age"  => 22,
            //  ],
            //]

            //上記のようにrequestの中身が配列の場合
            "group"         => ['required','array'],
            "group.*.name"  => ['required','string','max:100'],
            "group.*.age"   => ['required','integer','max:3'],
         ];
    }

messages()
・属性ごとに任意でメッセージを指定できる。

    public function messages()
    {
        return [
            'title.required'           => 'タイトルの入力は必須です',
            'title.string'             => 'タイトルは文字列で入力してください',
            'title.max'                => 'タイトルは255文字までです',

            //配列の場合
            'group.*.name.required' => '名前は入力必須です',
            'group.*.name.string'   => '名前は文字列で入力してください',
        ];
    }

Controllerで使用する際

引数にファイル名を指定することでControllerに入る前にバリデーションをかけてくれる。

public function store(StorePostRequest $request)
{
  //保存処理
}

補足

・formを送信してバリデーションにかかった場合、iputタグに入力していた値などは消えてしまうためoldメソッドを使用する。
第二引数にデフォルト値(初期値)を指定することができる。

<input id="title" type="text" name="title" value="{{ old('title',$title) }}">

・以下のようにすることでバリデーションにかかった際にmessage()で指定したエラーメッセージが表示される。

@foreach($errors->get('title') as $message)
   <li>{{ $message }}</li>
@endforeach
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?