はじめてのKohana (7) : バリデーション
この記事は賞味期限切れです。(更新から1年が経過しています)
「はじめてのKohana」、ラストの第七回目は、入力された値をチェックする為のバリデーションクラスを紹介します。
値のチェックができるValidクラス
単体の値のチェックには、Validクラスが使えます。
Valid::email("foo@example.com"); // <= TRUE
Valid::alpha_numeric("abcde12345"); // <= TRUE
Valid::url("http://www.example.com"); // <= TRUE
色々気の利いたバリデーション用メソッドが揃っているので、 詳しくは公式ドキュメントを確認してみてください。
Validationクラス
フォームで入力された値を一括してチェックしたり、エラーを管理したりする場合に使えるのが Validationクラスです。
初期化
まず、検査したい値を配列でまとめて、Validationに渡してインスタンスを生成します。 この配列は多くの場合$_POSTか、それを加工した物でしょう。
$vars = array(
"name" => "john",
"email" => "foo:example.com",
"url" => "http:/www.example.com",
"message" => ""
);
$validate = Validation::factory($vars);
ルールの追加
生成したインスタンスの rule メソッドを使ってルールを追加していきます。 今回のルールは以下のようにしてみました。
- name は8文字以上30文字以内
- email はEメールアドレスの形式で
- url はURLの形式で
- message は140文字以内で
- nameとmessageは必須
$validate ->rule("name", "not_empty") ->rule("name", "min_length", array(":value", 8)) ->rule("name", "max_length", array(":value", 30)) ->rule("email", "email") ->rule("url", "url") ->rule("message", "not_empty") ->rule("message", "max_length", array(":value", 140)) ;
ruleの引数は、rule( $field, $callback, $params ) となっており、 $fieldにはフィールド名、$callbackには先に紹介したバリデーション用のメソッド名を、 そして$param には$callbackに渡すパラメータを設定します。
“:value” とあるのは入力された値を展開する為のプレースホルダです。
バリデートの実行
ルールを設定したら、check メソッドでチェックしてみましょう。 エラーがでなければ登録等の処理を行い、そうでなければエラーメッセージを表示する等します。
if($validate->check()){
// バリデーションを無事通過したので、何か処理をする
echo "Thanks !";
} else {
// バリデーションエラーが発生
echo Debug::vars($validate->errors("validation"));
}
errors メソッドの引数には、メッセージファイルの名前を渡します。 そして、返す値はフィールド名をキーにした連想配列になっています。
メッセージファイルの名前が “validation” の場合は、/application/message/validation.php か、無ければ /system/message/validation.php を参照します。 後者は雛形としてはじめから用意されているので、編集の際には書式などを参考にしましょう。
さて、先程渡した $vars はわざとエラーが出るような内容にしておいたので、 上のチェックの結果は次のようになります。何も弄っていなければ、フルイングリッシュですね。
array(4) (
"name" => string(39) "name must be at least 8 characters long"
"email" => string(29) "email must be a email address"
"url" => string(17) "url must be a url"
"message" => string(25) "message must not be empty"
)
エラーメッセージのカスタマイズ
デフォルトのエラーメッセージだと英語のアラートが出るなんだか怖いサイトになってしまうので、 日本語のメッセージに置き換えてみましょう。
メッセージを再定義
下記のファイルを編集、もし無ければ新たに作成します。
/application/message/validation.php
そして、今回使用するルールだけを以下のように再定義してみます。
return array(
"not_empty" => ":field は必須項目です。",
"min_length" => ":field は :param2 文字以上で入力してください。",
"max_length" => ":field は :param2 文字以内で入力してください。",
"email" => ":field はEメールアドレスを入力してください。",
"url" => ":field はWebサイトアドレスを入力してください。"
);
:field はフィールド名、:param2 はメソッドに渡した第二引数を展開するプレースホルダです。 編集後に先程のエラーメッセージを改めて確認すると…
array(4) (
"name" => string(53) "name は 8 文字以上で入力してください。"
"email" => string(61) "email はEメールアドレスを入力してください。"
"url" => string(61) "url はWebサイトアドレスを入力してください。"
"message" => string(32) "message は必須項目です。"
)
メッセージが日本語化されました。が、フィールド名が英語のままで、気持ち悪いですね。
フィールドの別名(ラベル)を設定する
フィールド名には、別名(ラベル)を設定してそれを表示する事ができます。 ラベルの設定には label メソッドを使用します。
$validate
->label("name", "お名前")
->label("email", "E-Mail")
->label("url", "URL")
->label("message", "メッセージ")
;
このようにして改めて確認してみると、 以下のように無事、きちんとした日本語メッセージが表示されました。
array(4) (
"name" => string(58) "お名前 は 8 文字以上で入力してください。"
"email" => string(76) "E-Mail はEメールアドレスを入力してください。"
"url" => string(61) "URL はWebサイトアドレスを入力してください。"
"message" => string(40) "メッセージ は必須項目です。"
)
cf) Validation | Kohana User Guide
独自のルールでチェックする
rule メソッドの $callback に使えるのはValidクラスのメソッドだけでなく、定義済みの関数等も利用できます。
$validate->rule("user_id", "is_numeric"); // PHPの定義済み関数を使用
$validate->rule("user_id", "MyValid::is_user_id"); // 独自のバリデートクラスを使用
Validクラスのメソッドだけだと面倒、または冗長になるような場合、 独自のクラスを作ってみると見通しが良くなるかもしれません。
その場合は、メッセージも新たに追加してあげましょう。
return array(
…
"is_numeric" => ":field は数値で入力してください",
"MyValid::is_user_id" => ":field の形式が正しくありません"
);
まとめ
全七回にわたってKohanaフレームワークの紹介をさせて頂きました。 Kohanaに興味を持った方へ、何かしらのとっかかりになれればなと思います。
» もくじ
- Hello World !
- コントローラとビューの基本
- コントローラ
- ルーティング
- ビュー
- モデルとデータベース
- バリデーション
コメント