LaravelでGetリクエストのバリデーションのbool値がstringになる時の対処法

2022-05-15

2022-05-15

3 min read

Laravel

課題

Laravelのフォームリクエストでbooleanの値にバリデーションをかけようとした際にうまく動作しませんでした。

他のフォームリクエストでは動いていたのになぜだろう、、?

コードを追ってみるとaxiosのPostリクエストなどはうまく動作しているが、Getリクエストを使った際にうまく動作していませんでした。

axios.get('/test', {
    params: {
        is_hoge: true
    }
});
public function rules()
{
    return [
        'is_hoge' => ['boolean']
    ];
}

このようにGetリクエストでbooleanのis_hogeにバリデーションをかけようとしたら、Laravel側ではstringとなってしまってるため、思っている動作ができません。

原因

Getリクエストでは、urlにクエリパラメータとして指定したoptionのparamsが追加されるためstringとなってしまいます。

optionを使わずにクエリパラメータを指定すると下記のような形になります。

axios.get('/test?is_hoge=true');

ちなみに、Postリクエストなどではjson形式でリクエストできるので、laravel側のバリデーションは上記で上げた例の形で正常に動作します。

解決策

送信されたクエリパラメータをbooleanにキャストすることで、バリデーションをかけることができます。

public function validationData()
{
    $params = $this->all();
    if(isset($params['is_hoge'])) {
        $params['is_hoge'] = $this->boolean('is_hoge');
    }
    return $params;
}

public function rules()
{
    return [
        'is_hoge' => ['boolean']
    ];
}

これで思ってる動きになりました!

余談

Controller側でパラメータを受け取る際、色んな受け取り方があると思いますが、下記のような形で受け取るとバリデーションをかけた値を受け取れるので安心ですよ!

use App\\Http\\Requests\\Api\\Test\\TestGetRequest;

    public function test(TestGetRequest $request){
        $p = $request->validated();
        ・
        ・
        ・
    }