class Profile extends Eloquent {
protected $fillable = array('name', 'last_name', 'website', 'facebook', 'twitter', 'linkedin', 'google_plus');
public static function boot(){
parent::boot();
self::updating(function($model){
$model->name = Crypt::encrypt($model->name);
$model->last_name = Crypt::encrypt($model->last_name);
$model->facebook = Crypt::encrypt($model->facebook);
$model->twitter = Crypt::encrypt($model->twitter);
$model->linkedin = Crypt::encrypt($model->linkedin);
$model->website = Crypt::encrypt($model->website);
$model->google_plus = Crypt::encrypt($model->google_plus);
});
}
}
我正在使用这个事件。
$user->profile()->update(array(
'name' => e($input['name']),
'last_name' => e($input['last_name']),
'website' => e($input['website']),
'facebook' => e($input['facebook']),
'twitter' => e($input['twitter']),
'linkedin' => e($input['linkedin']),
'google_plus' => e($input['google_plus'])
));
由于某种原因,它没有触发任何事件...... 我正在尝试加密用户信息,然后再将其保存到数据库
答案 0 :(得分:2)
只有在调用save()方法时才会触发引导事件,而不是您正在使用的update()。
答案 1 :(得分:0)
我建议您使用与Accessors & Mutators类似的解决方案吗?在我看来,这是一个更好的解决方案,原因有几个。例如,您不必担心您的数据当前是否已加密;如果您尝试使用当前代码,那么在保存和加密数据之后您将拥有非加密数据,这样您甚至可以同时在对象上保存加密的和非加密数据。这可能会导致意想不到的事情发生。假设您有一个像这样的简单方法:
public function index($id) {
$user = User::find($id);
$user->name = 'Raphael';
echo($user->name); // 'Raphael'
$user->save();
echo($user->name); // Encrypted value for 'Raphael'
}
您怎么可能知道当您致电$user->name
时它是否会被加密?我的意思是,当然你可以建立一个只保存它们后通过模型发送的约定,但这似乎是在寻找麻烦,任何一点点缺乏关注都可能让你头疼。
另一方面,如果您使用此解决方案,您将始终将数据保存为已加密,但在您想要读取时不必担心解密,也不必在保存之前加密。这些方面的东西应该可以解决你的问题:
class Profile extends Eloquent {
protected static $encryptable = ['name', 'last_name', 'website', 'facebook', 'twitter', 'linkedin', 'google_plus'];
public function getAttribute($key) {
$value = parent::getAttribute($key);
if (in_array($key, static::$encryptable)) {
return Crypt::decrypt($value);
}
return $value;
}
public function setAttribute($key, $value) {
if (in_array($key, static::$encryptable)) {
$value = Crypt::encrypt($value);
}
parent::setAttribute($key, $value);
}
}
注意:我建议将其转换为abstract class
并从中扩展,或者如果您使用的是trait
,则建议使用{> = 5.4。