開発室ブログ

Codeigniter PHP Web API 健康

みんな大好き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),

引用元:github.com/bcit-ci/CodeIgniter/blob/develop/system/libraries/Form_validation.php#L505

ということで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データが無効(エラー)になるケースがあります…それはまたの機会に。

 では、今日はこの辺で ごきげんよう

参考資料

RecentPost