CodeIgniter 3 で bool 値をバリデーションチェックする

公開日時: 2022/10/03 04:52:42

解決したいこと

CodeIgniter 3 で bool 値のバリデーションチェックをしたい。

結論

必須入力等を考慮すると、文字列に変換してからチェックするのが良さそうです。
そもそも CodeIgniter 3 では大人しく数値 ( 0, 1 ) で判別するのほうが利口なのかもしれません。

課題

1. バリデーションルールが見当たらない

Rule Reference を確認しても bool 値のチェックをしてくれそうなルールが見つかりません。

2. in_list(true,false) は bool 値を判定できない

一番カンタンに実現できそうなのは in_list(true,false) のルールを設定することでした。
しかし、これは文字列にのみ有効で bool 値に対してはうまく機能しませんでした。

{
    "title": "INVALID_ARGUMENT",
    "status": 400,
    "detail": "○○○ は true,false のいずれかでなければなりません。"
}

3. required を利用すると false の場合にエラーとなる

妥協点として required のみにするという手も考えたのですが、渡された値が false の場合に機能しませんでした。

{
    "title": "INVALID_ARGUMENT",
    "status": 400,
    "detail": "○○○ は必須です。"
}

4. 独自バリデーションを定義してもキーが不在の場合はルールが走らない

ならば独自ルールを作成すればと思い、実際に作ってみました。
これで解決…と思ったのですが、キーが不在の場合は独自ルールが適用されず、required をつけると false の場合に上記の問題に引っかかるという状態でした。

解決策

最終的に以下の手順でバリデーションチェックをすることで解決しました。

  1. var_export($boolean, true) とすることで文字列としての true, false に変換する
  2. required|in_list[true,false] のルールでバリデーションチェックを実行する
  3. 文字列から switch で分岐して再度 bool 値に変換する

var_export($boolean, true) について

PHPer であればよく利用する var_export は第2引数の $returntrue に設定することで出力ではなく戻り値として利用することができます。

文字列からの bool 値変換について

こちらは switch を利用して愚直に書きます。

switch (set_value($field)) {
    case 'true':
        return true;
    default:
    case 'false':
        return false;
}