2013.
06.
20
16:18:57
FuelPHPではModel_Crudを継承したモデルを作成すると
あらかじめCRUD用のメソッドを含んだモデルになるのだそうな。
そこら辺をちょいと見ていこうかな、というのが今回のテーマです。
例えばModelCrud内の検証ルールをこんな感じで設定すれば
「save()」実行時にvalidateされるようですφ(--)
「required」は「必須ですよ~」
「max_length[5]」は「5文字(5Byteではなく5文字)以下にしてね~」
「valid_string[numeric]」は「数字だけOKよ~」の意味です。
つまりこの例は「column_varchar01」が「必須で5文字以下」で
「column_int02」は「数字だけOK」ですよ~なルールですね。
どんなルールを設定可能かは、頑張って
http://fuelphp.com/docs/classes/validation/validation.html
を眺めてください。
個人的には「required」「max_length」「min_length」「match_pattern」があれば事足りる、
それで足りなければ自作した方が良い気がします。
ちなみに「save()」メソッド実行時は自動的にこのルールに従ってチェックされます。
もし保存時にチェックしたくない場合は「save()」メソッドの引数にfalseを指定して
のようにすればスキップされますよ。
えっ?
「逆に任意の場所でvalidateしたいときはどうすれば良いか?」ですか?
仕方ないな~のび太くんは((≡ ̄ε ̄≡))
モデル内にvalidateロジックを呼び出す関数を用意してφ(--)
コントローラからその関数を呼び出せばOKですφ(--)
もっと簡単にできると思ったんですけどね。駄目でした。
モデル内に用意したvalidateロジックを呼び出す関数は
から「save()」メソッドの中身
を見てvalidateに関係ありそうな
の部分を引っこ抜いて余計なところを削除したものです。
最初コントローラから直接「pre_validate()」等を呼び出そうとしたのですが
「protected」に引っかかって呼べませんでした。
ここまでやっておいてなんですが、こんなことしないとできないってことは
「任意の場所でvalidateしようとすんな」という作った人の意志を感じますよ。
取りあえず、完了\(--)/
あらかじめCRUD用のメソッドを含んだモデルになるのだそうな。
そこら辺をちょいと見ていこうかな、というのが今回のテーマです。
例えばModelCrud内の検証ルールをこんな感じで設定すれば
「save()」実行時にvalidateされるようですφ(--)
<?php
class Model_Test01 extends Model_Crud
{
//使用するtable
protected static $_table_name = "tbl_test01";
//プライマリキー
protected static $_primary_key = "pk_id";
//データ検証用のルール
protected static $_rules = array(
'column_varchar01' => 'required|max_length[5]',
'column_int02' => 'valid_string[numeric]',
);
//値未設定時のデフォルト値
protected static $_defaults = array(
'column_int02' => 100
);
}
class Model_Test01 extends Model_Crud
{
//使用するtable
protected static $_table_name = "tbl_test01";
//プライマリキー
protected static $_primary_key = "pk_id";
//データ検証用のルール
protected static $_rules = array(
'column_varchar01' => 'required|max_length[5]',
'column_int02' => 'valid_string[numeric]',
);
//値未設定時のデフォルト値
protected static $_defaults = array(
'column_int02' => 100
);
}
「required」は「必須ですよ~」
「max_length[5]」は「5文字(5Byteではなく5文字)以下にしてね~」
「valid_string[numeric]」は「数字だけOKよ~」の意味です。
つまりこの例は「column_varchar01」が「必須で5文字以下」で
「column_int02」は「数字だけOK」ですよ~なルールですね。
どんなルールを設定可能かは、頑張って
http://fuelphp.com/docs/classes/validation/validation.html
を眺めてください。
個人的には「required」「max_length」「min_length」「match_pattern」があれば事足りる、
それで足りなければ自作した方が良い気がします。
ちなみに「save()」メソッド実行時は自動的にこのルールに従ってチェックされます。
もし保存時にチェックしたくない場合は「save()」メソッドの引数にfalseを指定して
$mt->save(false);
のようにすればスキップされますよ。
えっ?
「逆に任意の場所でvalidateしたいときはどうすれば良いか?」ですか?
仕方ないな~のび太くんは((≡ ̄ε ̄≡))
モデル内にvalidateロジックを呼び出す関数を用意してφ(--)
<?php
class Model_Test01 extends Model_Crud
{
//使用するtable
protected static $_table_name = "tbl_test01";
//プライマリキー
protected static $_primary_key = "pk_id";
//データ検証用のルール
protected static $_rules = array(
'column_varchar01' => 'required|max_length[5]',
'column_int02' => 'valid_string[numeric]',
);
//値未設定時のデフォルト値
protected static $_defaults = array(
'column_int02' => 100
);
//validateロジック呼び出し用関数
public function validate_hoge($data){
$vars = $this->pre_validate($data);
return $this->post_validate($this->run_validation($vars));
}
}
class Model_Test01 extends Model_Crud
{
//使用するtable
protected static $_table_name = "tbl_test01";
//プライマリキー
protected static $_primary_key = "pk_id";
//データ検証用のルール
protected static $_rules = array(
'column_varchar01' => 'required|max_length[5]',
'column_int02' => 'valid_string[numeric]',
);
//値未設定時のデフォルト値
protected static $_defaults = array(
'column_int02' => 100
);
//validateロジック呼び出し用関数
public function validate_hoge($data){
$vars = $this->pre_validate($data);
return $this->post_validate($this->run_validation($vars));
}
}
コントローラからその関数を呼び出せばOKですφ(--)
public function action_add4()
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'column_varchar01' => 'あああああa',
'column_int02' => 10,
'column_varchar02' => 'いいい',
);
$mt->set($data);
//値チェック
if ($mt->validate_hoge($data)){
print "チェックOK";
} else {
print "チェックNG";
return;
}
//保存
if(!$mt->save(false)){
print "保存失敗";
}else{
print "保存成功";
}
}
{
//インスタンス生成
$mt = Model_Test01::forge();
//値設定
$data = array(
'column_varchar01' => 'あああああa',
'column_int02' => 10,
'column_varchar02' => 'いいい',
);
$mt->set($data);
//値チェック
if ($mt->validate_hoge($data)){
print "チェックOK";
} else {
print "チェックNG";
return;
}
//保存
if(!$mt->save(false)){
print "保存失敗";
}else{
print "保存成功";
}
}
もっと簡単にできると思ったんですけどね。駄目でした。
モデル内に用意したvalidateロジックを呼び出す関数は
fuel/core/classes/model/crud.php
から「save()」メソッドの中身
public function save($validate = true)
{
if ($this->frozen())
{
throw new \Exception('Cannot modify a frozen row.');
}
$vars = $this->to_array();
// Set default if there are any
isset(static::$_defaults) and $vars = $vars + static::$_defaults;
if ($validate and isset(static::$_rules) and ! empty(static::$_rules))
{
$vars = $this->pre_validate($vars);
$validated = $this->post_validate($this->run_validation($vars));
if ($validated)
{
$validated = array_filter($this->validation()->validated(), function($val){
return ($val !== null);
});
$vars = $validated + $vars;
}
else
{
return false;
}
}
$vars = $this->prep_values($vars);
(以下略)
{
if ($this->frozen())
{
throw new \Exception('Cannot modify a frozen row.');
}
$vars = $this->to_array();
// Set default if there are any
isset(static::$_defaults) and $vars = $vars + static::$_defaults;
if ($validate and isset(static::$_rules) and ! empty(static::$_rules))
{
$vars = $this->pre_validate($vars);
$validated = $this->post_validate($this->run_validation($vars));
if ($validated)
{
$validated = array_filter($this->validation()->validated(), function($val){
return ($val !== null);
});
$vars = $validated + $vars;
}
else
{
return false;
}
}
$vars = $this->prep_values($vars);
(以下略)
を見てvalidateに関係ありそうな
if ($validate and isset(static::$_rules) and ! empty(static::$_rules))
{
$vars = $this->pre_validate($vars);
$validated = $this->post_validate($this->run_validation($vars));
if ($validated)
{
$validated = array_filter($this->validation()->validated(), function($val){
return ($val !== null);
});
$vars = $validated + $vars;
}
else
{
return false;
}
}
{
$vars = $this->pre_validate($vars);
$validated = $this->post_validate($this->run_validation($vars));
if ($validated)
{
$validated = array_filter($this->validation()->validated(), function($val){
return ($val !== null);
});
$vars = $validated + $vars;
}
else
{
return false;
}
}
の部分を引っこ抜いて余計なところを削除したものです。
最初コントローラから直接「pre_validate()」等を呼び出そうとしたのですが
「protected」に引っかかって呼べませんでした。
ここまでやっておいてなんですが、こんなことしないとできないってことは
「任意の場所でvalidateしようとすんな」という作った人の意志を感じますよ。
取りあえず、完了\(--)/