Литиевый универсальный модельный фильтр - PullRequest
3 голосов
/ 08 марта 2012

В настоящее время я разрабатываю приложение Lithium, которое требует добавления различных объектов в объект перед вызовом save ().

В идеале я хотел бы написать фильтр для применения к классу Model (базовая модель, которую расширяют другие модели), например:

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

Возможно ли это? Если так, то должен ли это быть загруженный файл?

Ответы [ 2 ]

5 голосов
/ 11 марта 2012

Если я не неправильно понимаю, что вы говорите, вы хотите, например, автоматически добавить значение для «созданного» или «измененного» объекта перед сохранением.

Вот как я это делаю.

Из моего 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);
        });
        // }}}
    }
}

?>

У меня там тоже есть хэши паролей. Вы можете удалить это, не затрагивая никакой функциональности.

4 голосов
/ 09 марта 2012

Фильтры не поддерживают наследование *.

Вам лучше использовать ООП и иметь класс BaseModel с переопределенным методом save (), от которого наследуются все модели ваших приложений.

Другим способом было бы лениво применять фильтры к каждой модели в файле начальной загрузки. Например:

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

с $timestamp закрытием

* фильтр наследования запланирован , но еще не реализован

...