- カテゴリ: validation
- 掲載バージョン: Laravel 12・PHP 8.4
- 名前空間 / FQCN / コマンド: ルール名
boolean - 関連: accepted/required/present/nullable/in
- 変更履歴: 5.x 以降で提供。受理値は(
true/false/1/0/"1"/"0")で不変。
要点(TL;DR)
- フィールド値が真偽値として解釈可能かを確認する。
- 最小コード:
'is_active' => ['required', 'boolean'] - よくある罠
"true"/"false"(文字列)は失敗。- チェックボックスの
"on"はaccepted向けで、booleanでは失敗。 - 「未送信」は通る(
required/present併用で制御)。
概要
boolean は入力が真偽値として扱えるかを検証します。API のフラグやフォームのトグル値などで使います。受理されるのは true / false / 1 / 0 / "1" / "0" のみです。UI 由来の "on" や "yes"、文字列の "true"/"false" は対象外なので注意してください。
構文 / シグネチャ
// 文字列記法
'rule_name' => 'boolean'
// 配列記法
'rule_name' => ['boolean']
- 引数(なし)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| ー | ー | ー | ー | ー |
- 戻り値:検証成功/失敗(失敗時はエラーを追加)
- 例外/副作用:失敗時に
Illuminate\Validation\ValidationExceptionが送出(自動リダイレクトや422 JSON)
使用例
最小例
<?php
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class FlagController extends Controller
{
public function store(Request $request)
{
$data = $request->validate([
'is_active' => ['required', 'boolean'], // 未送信を防ぐなら required を併用
]);
// 値を確実に bool で受けたい場合は boolean() で取得
$isActive = $request->boolean('is_active');
// 保存処理...
return response()->noContent();
}
}
実務例(JSON API・文字列 “true”/”false” を許容したい)
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdatePostRequest extends FormRequest
{
public function rules(): array
{
return [
'published' => ['nullable', 'boolean'], // null 許容
];
}
// "true"/"false" 文字列を事前に正規化
protected function prepareForValidation(): void
{
if ($this->has('published')) {
$this->merge([
'published' => filter_var($this->input('published'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
]);
}
}
public function messages(): array
{
return [
'published.boolean' => '公開フラグは true/false または 1/0 を指定してください。',
];
}
}
// Controller 側
$post->published = request()->boolean('published'); // on/yes/true/1 を true に解釈
$post->save();
よくある落とし穴・注意
- 文字列 “true”/”false” は失敗:
booleanが受理するのはtrue/false/1/0/"1"/"0"のみ。フロントが文字列を送る場合はprepareForValidation()で正規化、またはRequest::boolean()で取得する。 - チェックボックスの
"on"は対象外:チェック状態の有無を検証したいならacceptedを使う。 - 「未送信」は通る:
boolean自体は存在必須ではない。必須にするならrequired、キーの存在のみを必須にするならpresentを併用。 - キャストとの混同:Eloquent の
$casts = ['flag' => 'bool']は保存時の型変換。受理値の検証は別物。バリデーションで弾くべき。
通過/失敗ケース表
| 入力値 | 結果 | 備考 |
|---|---|---|
true / false | 通過 | PHP の bool |
1 / 0 | 通過 | int |
"1" / "0" | 通過 | 文字列でも可 |
"true" / "false" | 失敗 | 文字列は不可(正規化が必要) |
"on" / "off" / "yes" / "no" | 失敗 | accepted 向け表現 |
| 未送信 | 通過 | required が無い場合 |
null | 失敗 | nullable 併用で通過にできる |
代替・関連APIとの比較
- accepted:チェックボックス「同意」の受理(
"yes","on",1,"1",true)。UI の同意欄はこっち。 - in:1,0:受理値を 1/0 のみに限定したいとき。
- present:キー存在を必須(空値可)。
present|booleanで「必ず送って真偽値」。 - nullable:
nullを許容。 - Request::boolean(‘key’):取得時に真偽へ変換(
"true","on","yes"なども true へ)。検証と取得の役割を分けられる。
テスト例(Pest)
<?php
use Illuminate\Support\Facades\Validator;
it('validates boolean', function () {
// 成功
$ok = Validator::make(['f' => '1'], ['f' => 'boolean'])->passes();
expect($ok)->toBeTrue();
// 失敗("true" 文字列)
$ng = Validator::make(['f' => 'true'], ['f' => 'boolean'])->fails();
expect($ng)->toBeTrue();
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| 「The is_active field must be true or false.」 | "true"/"false" の文字列が送られている | prepareForValidation() で filter_var(..., FILTER_VALIDATE_BOOLEAN) してから検証/または Request::boolean() で取得 |
| チェックボックスを付けたのに失敗 | "on" が送信されている | ルールを accepted に変更する/サーバ側で boolean() 取得に切り替える |
| 値を送っていないのに通る | required を付けていない | `required |
null を許したい | nullable が無い | `nullable |
