みんな大好きCodeigniterのバリデーション
アキレス腱断裂手術から3ヶ月ほど経過し、おかげ様で少しずつでありますが徐々に回復に向かっております。まだリハビリは続いていますが、装具を外して歩いたり、車の運転とかも出来るようになりました。
今は週イチでリハビリしてますが、1ヶ月程前の女医ちゃん診察時に同席していたPTさんから患部周辺の癒着により腱が硬化しているので超音波の照射を女医ちゃんに進言してました。
これにより次回のリハビリから超音波照射の施術が施されるようになりました。 この装置が気になる方はこちらをご覧くださいw コンビネーション刺激装置EU-910 照射は毎回10~15分ほど実施します。まずは患部周辺にジェルを塗り、あとはPTさんが患部周辺にプローブをあてがいます。イメージとしてはエコー検査を実施しているような感じで、施術中は痺れや熱等が一切感じないので食後などはウトウトしちゃいます。
これにより癒着が解消され、むくみも無くなり、足首の可動域が広がることで早期の回復が見込めそうです。次回のブログまでにはきっと完全復活するでしょう(㍉ムリ…)
起
術後報告はコレくらいにして、今回は久しぶりに技術ネタです(技術ネタに回帰してきた開発室)
PHPのフレームワークであるCodeigniterにてバリデーションを検証するとき、様々なチェックを実施すると思いますがCodeigniterで用意されているルールやPHP関数の他にユーザによる独自のバリデーションルールを定義することも可能です。
例えば
入力値idは必須とし、6桁の数字のみで構成しており、その値は登録済であること
のような入力条件とした場合、以下のようなバリデーションルール(セットグループinput_id
)を定義します。なお、検証対象のid
値は既にDB登録済とします。
$config = [
'input_id' => [
[
'field' => 'id',
'label' => 'ID',
'rules' => 'trim|required|numeric|exact_length[6]|callback_is_id'
]
]
];
バリデーションルールの説明
- trim:PHPのtrim()関数
- required:入力有無チェック
- numeric:数字チェック
- exact_length[n]:桁数チェック
- callback_callback function:コールバック関数によるチェック
バリデーションルールとしてコールバック関数を定義しています。これはユーザが自由に定義できるバリデーションルールであり、この例のコールバック関数is_id()
はDBにアクセスして指定されたid
があればTrue
、無ければFalse
を返却する関数を定義します。
このルールにてid
に‘123a56’と入力するとバリデーションルールのnumeric
(数字以外の文字を含む場合False)でエラーとなると思われますが、実際にはコールバック関数is_id()
でid
未登録エラーとなります。
ナゼ??
承
結論から言いますと
“Callbacks” are given the highest priority (always called),
ということでCodeigniterではコールバック関数によるバリデーションルールは最優先に検証します(「何を今さら」って言われると話が終わっちゃいますので、もう暫くお付き合い下さい)これはCodeigniterの仕様であり、そもそもCodeIgniterにおけるバリデーションとは -
- 加工
- 検証
という役割を担っており、加工してから検証するのがCodeigniterにおけるバリデーションのポリシーで、コールバック関数によるバリデーションルールは加工として位置づけているようです。
しかしながら、上記の例ではバリデーションルールとして定義したコールバック関数の機能はDBにアクセスして値の有無を返却する実装をしており、頻繁にコールすることによりDBアクセスによる処理のオーバーヘッドが増大する懸念があります(杞憂かもしれませんが)
従いましてコールバック関数を各種バリデーションルールの最後に検証させるべく、検証順位の変更方法を調査しました。
転
もともとあるバリデーションルールの検証順を定義しているForm_validation
クラス(system/libraries/Form_validation.php)をMY_Form_validation
クラスとして継承し、それをapplication/libraries/MY_Form_validation.php
として新規にファイルを追加します。継承したクラスの_prepare_rules
メソッドを以下の通りオーバーライドすることでバリデーションルールの検証を定義順とすることが出来ます。
application/libraries/MY_Form_validation.php
class MY_Form_validation extends CI_Form_validation
{
protected function _prepare_rules($rules)
{
return $rules;
}
}
結
これによりバリデーションルールの検証順をコントロール(左からのルール検証)することが可能となりました。いまだにコールバック関数が最優先となる理由が分かりません。ユーザが任意に決められるほうが自由度が増していいと思うのですがねぇ…
おまけ
APIにてJSON形式のPOSTデータをリクエストする場合、値の指定方法によってPOSTデータが無効(エラー)になるケースがあります…それはまたの機会に。
では、今日はこの辺で ごきげんよう