簡體   English   中英

鋰通用模型濾波器

[英]Lithium Generic Model Filter

我目前正在開發一個Lithium應用程序,它需要在調用save()之前向對象添加各種內容。

理想情況下,我可以編寫一個過濾器來應用於Model類(其他模型擴展的基本模型),如下所示:

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

這可能嗎? 如果是這樣,它應該是一個自舉文件?

如果我沒有誤解你所說的內容,你想要在保存之前自動為對象添加“已創建”或“已修改”的值。

我就是這樣做的。

來自我的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);
        });
        // }}}
    }
}

?>

我也有一些密碼哈希。 您可以刪除它而不影響任何功能。

過濾器不支持繼承*。

你最好使用OOP並使用一個帶有重寫的save()方法的BaseModel類,並從中繼承所有的app模型。

另一種方法是在引導文件中懶洋洋地將過濾器應用於每個模型。 例如:

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

使用$timestamp一個閉包

*過濾器繼承已計划但尚未實施

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM