November 28, 2011

Orm\Modelでバリデーションを定義する。

2011/12/03 追記
こちらも併せて御覧ください。
http://madroom-project.blogspot.com/2011/12/ormmodelobservers.html



前回の記事に書いたモデルにバリデーションを追加してみます。
http://madroom-project.blogspot.com/2011/11/ormmodel.html

\app\classes\model\twitter\user.php
namespace Model;

class Twitter_User extends \Orm\Model
{
 
    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array('before_insert'),
        'Orm\Observer_UpdatedAt' => array('before_save'),
        'Orm\Observer_Validation' => array('before_save'),
    );

    protected static $_properties = array(
        'id', 
        'created_at',
        'updated_at',
        'user_id',
        'twitter_user_id' => array(
            'validation' => array(
                'trim',
                'required',
                'max_length' => array(255),
                'valid_string' => array('integer'),
            ),
        ),
        'twitter_screen_name' => array(
            'validation' => array(
                'trim',
                'required',
                'max_length' => array(255),
                'match_pattern' => array('/^([a-zA-Z0-9_])+$/'),
            ),
        ),
        'twitter_oauth_token' => array(
            'validation' => array(
                'trim',
                'required',
                'max_length' => array(255),
                'match_pattern' => array('/^([a-zA-Z0-9\-])+$/'),
            ),
        ),
        'twitter_oauth_token_secret' => array(
            'validation' => array(
                'trim',
                'required',
                'max_length' => array(255),
                'valid_string' => array('alpha_numeric'),
            ),
        ),
    );

    protected static $_belongs_to = array(
        'user' => array(
            'key_from' => 'user_id',
            'model_to' => 'Model\User',
            'key_to' => 'id',
            'cascade_save' => false, // trueにすると一切の変更がない場合のsave()でエラーとなる。
            'cascade_delete' => false, // trueにすると削除時に親も消してしまう。注意。
        )
    );
}
match_patternの内容からrequired要らないじゃん。とかは、無しでお願いします。。。
その他、ツイッタの認証情報に対する検証精度は保証出来ません。。。


ポイントは
* $_observersに'Orm\Observer_Validation' => array('before_save')を追加すること。
* $_propertiesにカラム毎の定義を書くこと。
の二点と思います。
尚、$_propertiesには、内部でしか使用しないidやcreated_atも書いておかないとエラーになりました。

バリデーションの細かな使い方は
\core\classes\validation.php
を見て、なんとなく確認しました。

で、気づいた方もいらっしゃるかと思いますが、各バリデーションに'trim'と書いています。
CodeIgniterでは、以下のような事がバリデーションで可能です。
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html
> Note: また、 trim、htmlspecialchars、urldecode などの引数を1つだけとる
> PHP の組み込み関数をどれでも使用することができます。

FuelPHPでも見事、出来ました。
恐らく、書いた順に実行されるはずなので、md5する場合とかは、一番最後に書きましょう。


追記:
使い方を書いていなかったので、書いておきます。
$twitter_userは前述のTwitter_Userモデルです。
try
{
    $twitter_user->save();
    // TODO: 成功時の処理
}
catch (Orm\ValidationFailed $e)
{
    // TODO: エラー時の処理(エラーメッセージは $e->getMessage() で取得可。)
}

参考:
http://docs.fuelphp.com/packages/orm/creating_models.html
http://docs.fuelphp.com/packages/orm/observers/included.html

No comments:

Post a Comment