logo
Home
About
Works
Blog
Contact

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

2022-05-15

2022-05-15

3 min read

Laravel

目次


  1. 課題
  2. 原因
  3. 解決策
  4. 余談

課題

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

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

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

js側
axios.get('/test', {
params: {
is_hoge: true
}
});
laravelのフォームリクエスト
public function rules()
{
    return [
'is_hoge' => ['boolean']
]; }

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

原因

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

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

URLにクエリパラメータを指定
axios.get('/test?is_hoge=true');

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

解決策

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

キャストして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側でパラメータを受け取る際、色んな受け取り方があると思いますが、下記のような形で受け取るとバリデーションをかけた値を受け取れるので安心ですよ!

laravelのフォームリクエスト
use App\Http\Requests\Api\Test\TestGetRequest;

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