kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

laravelのvalidateサンプル

日々Webアプリを開発していますが、フォーム入力とバリデートはどのフレームワークを使用しても書いています。

最近はlaravelを使用することが多く、validate周りでの記事を書いてみます。

validate

readouble.com

laravelのvalidate

    public function store(Request $request){
        $request->validate([       // <-- ここがバリデーション部分
            'name' => 'required',
            'birthday' => 'required',
            'sex' => 'required',
        ]);
        $this->store();
    }

validateの条件に引っかかった場合は、直前の画面へ自動でリダイレクトがかかります。エラーの表示内容は、入力画面のviewにエラー表示用のコードを記述する必要があります。

では、受信リクエストフィールドが指定したバリデーションルールにパスしない場合はどうなるでしょうか。前述のように、Laravelはユーザーを直前の場所へ自動的にリダイレクトします。さらに、すべてのバリデーションエラーとリクエスト入力は自動的にセッションに一時保持保存されます。

viewでの表示

<input id="name" type="text" name="name" class="@error('name') is-invalid @enderror">

@error('name')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

エラーがある場合にエラーメッセージを表示するようになります。実際に使う場合はフォームに入力した内容を表示したほうがいいため、inputフォームのvalueに$request->oldの値を入れています。

また複数の条件を指定する場合は「|」で区切るか配列にすると複数条件でvalidateを設定できます。

    public function store(Request $request){
        $request->validate([       // <-- ここがバリデーション部分
            'price' => 'required|numeric',
        ]);
        $request->validate([       // <-- ここがバリデーション部分
            'price' => ['required', 'numeric'],
        ]);
        $this->store();
    }

いくつかvalidateのユースケースを書いていきます。

testコード

namespace Tests\Feature;


use Tests\TestCase;

class ValidateTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function test_required()
    {
        $response = $this->post('/validate/required', [
            'name' => "test"
        ]);
        $response->assertStatus(200);

        $response = $this->post('/validate/required', [
            'name' => ""
        ]);
        $response->assertStatus(302);
    }
}

validateの場合,302になるのを利用して、testを実行します。ちゃんとやるならvalidateの内容まで取得する必要はありそうですが、今回はできることを優先します。

validateサンプル

必須

        $request->validate([ 
            'name' => 'required',
        ]);

数字

        $request->validate([ 
            'price' => 'numeric',
        ]);

選択肢

use Illuminate\Validation\Rule;

        $request->validate([ 
            'sex' => Rule::in([1, 2]),
        ]);

ファイル(画像)

        $request->validate([ 
            'image' => 'mimes:jpg,png',
        ]);

imageのvalidateもありますが、範囲が広かったのでmimetypeにしました。

まとめ

一般的なvalidateから書いてみました。

validateで困ることが最近多くなったので、記録しながら機能追加をしていこうと思うので、まずは基礎的な部分からの記述です。

PHPStormでtestコードを実行しようと設定をしていたのですが、docker-composeを利用したinterpreterがうまく設定できずかなりの時間を使ってしまいました。結局設定できなかったので、terminalでphpunitコマンドを実行してテストを実行していきます。

m1チップの影響かな。docker-compose.ymlの書き方が悪いなら直したいけど、docker自体は動作しているので深く調べるのはやめておきます。

少しずつ追加していけたらと思っています。