FuelPHPをやってみる (4) - Model_Crudでバリデーション -
タイトル通り。フォームからの入力を検証してエラーの場合はフォームにリダイレクト後にエラーメッセージを表示する。セッション管理機能を使うのでfuel/app/config/session.phpの設定が必要
fuel/app/classes/model/items.php
<?php
class Model_Items extends Model_Crud {
protected static $_table_name = "items";
// バリデーションルールを定義
protected static $_rules = array(
"item_name" => "required|max_length[50]|match_pattern[/w+/]",
"price" => "required|valid_string[numeric]"
);
// カラムに対する項目ラベルを設定
protected static $_labels = array(
"item_name" => "アイテム名",
"price" => "値段"
);
}
ルールを定義するだけ。詳しいバリデーションルールの定義方法に関しては http://docs.fuelphp.com/classes/validation/validation.html を参照。今回はitemnameにrequired、max_length、match_patternの検証制約を設定、priceにrequired、validstring[numeric](値が数値であるかのチェック)を設定する
でエラーメッセージをカスタマイズしたいのでfuel/app/lang/ja/validation.phpを作る
fuel/app/lang/ja/validation.php
<?php
return array(
"required" => ":labelを入力してください",
"max_length" => ":labelの値は:param:1以内で指定してください",
"match_pattern" => ":labelが条件に一致しません"
);
fuel/core/lang/en/validation.phpをコピってからいじった方がいいかと。んな感じで定義出来て、メッセージ変数として http://docs.fuelphp.com/classes/validation/errors.html のEror Messagesセクションを参照
fuel/app/classes/controller/home.php
<?php
class Controller_Home extends Controller {
public function action_index() {
$entries = Model_Items::find_all();
is_null($entries) and $entries = array();
$data["entries"] = $entries;
// register側から来たエラーメッセージをViewにバインド
$data["errors"] = Session::get_flash(
"validator_errors",
array()
);
return View::forge("home/index", $data);
}
public function action_register() {
if (Input::method() === "POST") {
// フォームからの値を参照してモデルインスタンスを作る
$item = Model_Items::forge(
array(
"item_name" => Input::post("item_name"),
"price" => Input::post("price")
)
);
// 検証開始。オッケーなら挿入処理を続行する
// validationメソッドを使うとバリデーションオブジェクト(恐らくはFuelCoreValidation)を取得出来る模様
if ($item->validates()) {
try {
DB::start_transaction();
$item->save();
DB::commit_transaction();
} catch (Database_Exception $e) {
DB::rollback_transaction();
}
} else {
// 検証に失敗した場合はそのエラーメッセージをセッションに格納する。その際、永続性を持たせる必要は無いのでflashオブジェクトを利用する
$save_errors = array();
$errors = $item->validation()->error();
foreach ($errors as $err) {
array_push($save_errors, $err->get_message());
}
Session::set_flash("validator_errors", $save_errors);
}
}
return Response::redirect("/");
}
}
フォームから送信されたデータが検証でエラーが出た場合にそのエラーメッセージをセッションのflashオブジェクトに格納して、リダイレクト先であるindexでそれを参照してビューにバインドする