2011-10-25 5 views
0

J'ai besoin d'aide avec applyFilter() pour le mot de passe. Le filtre fonctionne correctement lorsque je crée un nouvel enregistrement (c'est-à-dire, enregistrer).Utiliser applyFilter pour les mises à jour

Mais comment dois-je modifier le filtre pour crypter également le mot de passe lorsque je mets à jour le mot de passe.

Voici mon filtre de sauvegarde.

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

Merci

Répondre

1

Vous devez hachage du mot de passe uniquement quand il a changé. Dans l'objet entité, nous pouvons obtenir les données d'origine pour l'entité et voir si elle a été mise à jour. De même, nous ne voulons pas hacher le mot de passe si le champ mot de passe est vide.

En supposant que vous faites quelque chose comme ceci:

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

ensuite le code suivant devrait fonctionner.

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); 
}); 
Questions connexes