3

私は現在、save() が呼び出される前にオブジェクトにさまざまなものを追加する必要がある Lithium アプリケーションを開発しています。

理想的には、次のような Model クラス (他のモデルが拡張する基本モデル) に適用するフィルターを作成できます。

Model::applyFilter('save', function($self, $params, $chain) {
    // Logic here
});

これは可能ですか?もしそうなら、それはブートストラップされたファイルであるべきですか?

4

2 に答える 2

5

あなたの言っていることを誤解していなければ、たとえば、保存する前にオブジェクトに「作成済み」または「変更済み」の値を自動的に追加したいと考えています。

これが私がそれを行う方法です。

私からextensions/data/Model.php

<?php
namespace app\extensions\data;
use lithium\security\Password;

class Model extends \lithium\data\Model {

    public static function __init() {
        parent::__init();

        // {{{ Filters
        static::applyFilter('save', function($self, $params, $chain) {
            $date   = date('Y-m-d H:i:s', time());
            $schema = $self::schema();

            //do these things only if they don't exist (i.e.  on creation of object)
            if (!$params['entity']->exists()) {

                //hash password
                if (isset($params['data']['password'])) {
                    $params['data']['password'] = Password::hash($params['data']['password']);
                }

                //if 'created' doesn't already exist and is defined in the schema...
                if (empty($params['date']['created']) && array_key_exists('created', $schema)) {
                    $params['data']['created'] = $date;
                }
            }

            if (array_key_exists('modified', $schema)) {
                $params['data']['modified'] = $date;
            }
            return $chain->next($self, $params, $chain);
        });
        // }}}
    }
}

?>

そこにもいくつかのパスワードハッシュがあります。機能に影響を与えることなく削除できます。

于 2012-03-11T15:08:23.540 に答える
4

フィルタは継承*をサポートしていません。

OOPを使用BaseModelし、save()メソッドがオーバーライドされ、すべてのアプリモデルが継承するクラスを作成することをお勧めします。

もう1つの方法は、ブートストラップファイルで各モデルにフィルターを遅延適用することです。例えば:

Filters::apply('app\models\Documents', 'save', $timestamp);
Filters::apply('app\models\Queries', 'save', $timestamp);
Filters::apply('app\models\Projects', 'save', $timestamp);

$timestampクロージャー付き

*フィルターの継承は計画されていますが、まだ実装されていません

于 2012-03-09T02:41:01.633 に答える