Mach3.laBlog

はじめてのKohana (7) : バリデーション

この記事は賞味期限切れです。(更新から1年が経過しています)

「はじめてのKohana」、ラストの第七回目は、入力された値をチェックする為のバリデーションクラスを紹介します。

はじめてのKohana

値のチェックができるValidクラス

単体の値のチェックには、Validクラスが使えます。

Valid::email("foo@example.com"); // <= TRUE
Valid::alpha_numeric("abcde12345"); // <= TRUE
Valid::url("http://www.example.com"); // <= TRUE

色々気の利いたバリデーション用メソッドが揃っているので、 詳しくは公式ドキュメントを確認してみてください。

cf) Valid | Kohana User Guide

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に興味を持った方へ、何かしらのとっかかりになれればなと思います。


» もくじ

  1. Hello World !
  2. コントローラとビューの基本
  3. コントローラ
  4. ルーティング
  5. ビュー
  6. モデルとデータベース
  7. バリデーション

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

栗林高広556dcbbf86be7b12e04bf564757dec6e
<p>全7回、通読させていただきました。</p>