使用applyFilter进行更新

时间:2011-10-25 04:57:15

标签: php lithium

我需要applyFilter()的密码帮助。当我创建一个新记录(即保存)时,过滤器工作正常。

但是当我更新密码时,如何修改过滤器以加密密码。

这是我的保存过滤器。

Users::applyFilter('save', function($self, $params, $chain) {
    if ($params['data']) {
        $params['entity']->set($params['data']);
        $params['data'] = array();
    }
    if (!$params['entity']->exists()) {
        $params['entity']->password = Password::hash($params['entity']->password);
    }
    return $chain->next($self, $params, $chain);
});

由于

1 个答案:

答案 0 :(得分:1)

只有在密码更改时才需要对密码进行哈希处理。在实体对象中,我们可以获取实体的原始数据并查看它是否已更新。同样,如果密码字段为空,我们不想散列密码。

假设你正在做这样的事情:

$user = Users::first($id);
if (!empty($this->request->data) && !empty($user)) {
    if ($user->save($this->request->data)) {
        // woohoo
    } else {
        // bummer
    }
}

然后以下代码应该可以工作。

Users::applyFilter('save', function($self, $params, $chain) {
    if ($params['data']) {
        $params['entity']->set($params['data']);
        $params['data'] = array();
    }
    $entity = $params['entity'];
    if ($entity->password) {
        $export = $entity->export();
        if (empty($export['data']['password']) || $export['data']['password'] != $entity->password) {
            $entity->password = Password::hash($entity->password);
        }
    }
    return $chain->next($self, $params, $chain);
});