【Laravel】リクエストパラメータをstringからboolにキャストする
小ネタです。
Laravelにてリクエストパラメータのbool値がstring値として取得できてしまうので困ること、あると思います。
GETリクエストでのクエリストリングの場合やフォームから送信されてContent-Typeが application/x-www-form-urlencoded
形式の場合、JSON形式と違って文字列かそうでないかを判別できないためです。
そこで今日は弊社がよく使っている秘伝のTraitをご紹介したいと思います。
StringCastBoolTrait
まず先にコードを見てみてください。
use Illuminate\Support\Arr;
trait StringCastBoolTrait
{
private string $IS_TRUE = 'true';
private string $IS_FALSE = 'false';
private string $IS_TRUE_INTEGER = '1';
private string $IS_FALSE_INTEGER = '0';
/**
* @param array<string, mixed> $attribute
* @param array<string> $castKeys
* @return array<string, mixed>
*/
public function stringCastBool(array $attribute, array $castKeys): array
{
foreach ($castKeys as $key) {
if (
Arr::get($attribute, $key) === $this->IS_TRUE ||
Arr::get($attribute, $key) === $this->IS_TRUE_INTEGER
) {
Arr::set($attribute, $key, true);
} elseif (
Arr::get($attribute, $key) === $this->IS_FALSE ||
Arr::get($attribute, $key) === $this->IS_FALSE_INTEGER
) {
Arr::set($attribute, $key, false);
}
};
return $attribute;
}
}
第一引数でリクエストパラメータをarrayで受け取り、第二引数でboolにキャストしたいリクエストパラメータのkeyをこれまたarrayで受け取れるようにしています。
やっていることは単純で、boolにキャストしたいパラメータの内容がtrue/false/1/0のどれかと一致するか否かを計算しているだけです。
(それら以外の値で比較したい場合の拡張は自由にしていただければ)
使用例
このTraitを使用する側も簡単で、まずコードを見てみてください。
use Illuminate\Foundation\Http\FormRequest;
Class SomeRequest extends FormRequest
{
use StringCastBoolTrait;
/**
* @param array<string>|null $keys
* @return array<string, mixed>
*/
public function all($keys = null): array
{
$attribute = parent::all($keys);
return $this->stringCastBool(
$attribute,
[
'boolParam'
]
);
}
}
こんな感じです。
stringCastBool()の第二引数にはboolに変換したいパラメータのkeyのみを入れましょう。
all()に書くことで$request→all()や$request→validated()でリクエストパラメータを取得するときに勝手にboolにキャストされた状態になってくれます。
終わりに
ここまで書いて、なんとLaravel 9.x系から
$request->boolean('boolParam');
が使えるようになっていました。
今気づきました。
ピンポイントでboolへのキャストがしたいときは$request→boolean()で事足りますね。
参考
https://readouble.com/laravel/9.x/ja/requests.html
以上です。