LaravelでGetリクエストのバリデーション時にbooleanがstringになる時の対処法
2022-05-15
2022-05-15
3 min read
Laravel
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();
・
・
・
}