0
1

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 5 years have passed since last update.

[Laravel] FormRequestクラスのまとめ

0
Posted at

今回の題

Laravelのバリデーションで用いるフォームリクエストという機能を解説、まとめた記事です。
ググればたくさん情報が出てきますが、自分の言葉でまとめておきたかったので筆を取りました。
間違いや注意点などありましたらコメントにお願いします🙇‍♀️

検証したバージョン

Laravel 7.30.0

フォームリクエストを利用するには

フォームリクエストの作成

プロジェクトデイレクトリで以下のコマンドを打つと、app/Http/RequestにStoreBlogPostクラスが作成されます。

$ php artisan make:request StoreBlogPost

メソッドにDIする

コントローラーにリクエストを受け取りその内容を保存するstoreというメソッドがあったとします。

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

そのメソッドのRequestクラスをDIしている箇所を、先ほど作成したStoreBlogPostクラスに置き換えれば、保存処理の前にフォームリクエストに定義したバリデーションが適応されるようになります。

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

使い方

フォームリクエストは初期状態だと以下のようになっています。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreBlogPost 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
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

定義されているメソッドは2つ、

authorize()

リクエストを行ったユーザーの権限を確かめるメソッドです。
falseを返すとアクセスが拒否されたことを示す403エラーを吐き、
trueを返すと認可してバリデーションを行います。
認証をコントローラーやポリシーなどで行っている場合は恒常でtrueを返しておきます。

    public function authorize()
    {
        return true;
    }

rules()

バリデーションのルールを記載するメソッドです。
前提として以下のようなformがあったとします。

<form action="" method="POST">
    <input type="text" name="title">
    <textarea name="body"></textarea>
</form>

この内容に対して適当なバリデーションをあててみます。


    public function rules()
    {
        return [
            'title' => 'required | unique:posts | max:255',
            'body' => 'required',
        ];
    }

上記のように'項目名' => 'ルール'の形で記入し、ルールが複数あるときは|を使い'ルール|ルール'といった具合に書きます。

このコードで各項目にあてられたバリデーションは以下のようになっています。

  • title
    入力必須
    postsテーブルにてユニークな(重複しない)値
    255字以内

  • body
    入力必須

使用できるルールはここで確認できます。

オーバーライドして使用できるメソッド

attributes()

バリデーションメッセージ内に表示される項目名はそのままだとtitlebodyのままですが、このメソッドから任意の名前にカスタマイズすることが可能です。

    public function attributes()
    {
        return [
            'title' =>'タイトル',
        ];
    }

messages()

バリデーションで弾かれた場合、ユーザーはバリデーションメッセージを抱えた状態で直前のページにリダイレクトされます。
その時のメッセージをカスタマイズするメソッドです。

    public function messages()
    {
        return [
            'title.required' => 'タイトルは必須です',
            'title.unique' =>'既に存在するタイトルです',
        ];
    }

上記のように項目名.ルールの形で記入します。

prepareForValidation()

バリデーション前にデータを加工する際に用いるメソッドです。

    protected function prepareForValidation()
    {
        $this['user_id'] = Auth::id();
    }

例としてリクエストにログインユーザーのidを追加してみました。

配列に対してバリデーションを行う

おまけです。
前提として以下のような画像複数枚を配列で送信するformがあるとします。

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="images[]">
    <input type="file" name="images[]">
    <input type="file" name="images[]">
</form>

この配列の一つ一つにバリデーションを行うには以下のようにします。

    public function rules()
    {
        return [
            'images.*' => 'image | mimes:jpeg,png,jpg'
        ];
    }

全部に同じルールを適応するのであれば'項目.*'とし、一つ一つに行うのであれば項目.配列の添字番号とします。

参考

Illuminate/Foundation/Http/FormRequest.php
readouble

一言

何か面白いメソッドないかとソース見ましたが、特になかったためほぼreadoubleに乗っている内容になりました🚗

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?