プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.6、Model_Crudついて理解する(3)データの検証(validate)
FuelPHPではModel_Crudを継承したモデルを作成すると
あらかじめ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
    );
}

「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));
    }

}

コントローラからその関数を呼び出せば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 "保存成功";
    }
}

もっと簡単にできると思ったんですけどね。駄目でした。
モデル内に用意した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);
(以下略)

を見て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;
    }
}

の部分を引っこ抜いて余計なところを削除したものです。

最初コントローラから直接「pre_validate()」等を呼び出そうとしたのですが
「protected」に引っかかって呼べませんでした。

ここまでやっておいてなんですが、こんなことしないとできないってことは
任意の場所でvalidateしようとすんな」という作った人の意志を感じますよ。

取りあえず、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:FuelPHP  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事