boolean(バリデーションルール) — 真偽値かを検証する

  • カテゴリ: 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 で「必ず送って真偽値」。
  • nullablenull を許容。
  • 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

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする