Laravel模型事件更新()未触发

时间:2014-06-30 07:07:48

标签: php laravel-4 eloquent

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'])
));

由于某种原因,它没有触发任何事件...... 我正在尝试加密用户信息,然后再将其保存到数据库

2 个答案:

答案 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。