Использование applyFilter для обновлений - PullRequest
0 голосов
/ 25 октября 2011

Мне нужна помощь с 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 Ответ

1 голос
/ 30 октября 2011

Пароль нужно хешировать только при его изменении. В объекте сущности мы можем получить исходные данные для сущности и посмотреть, были ли они обновлены. Аналогично, мы не хотим хешировать пароль, если поле пароля пустое.

Предположим, вы делаете что-то вроде этого:

$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);
});
...