2014-06-30 44 views
3
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); 
     }); 
    } 
} 

我使用過調用事件..Laravel型號事件更新()不費一槍

$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

當然,它沒有更新,對於引導函數,你沒有傳遞任何東西,其次,對於剛剛通過的模型更新函數,這是不正確的,你需要將所有參數傳遞給你要加密的函數 –

+0

@LeventeNagy您是否閱讀過laravels模特活動的文檔? 'boot()'方法不需要任何參數,並且事件關閉模型被傳遞。 http://laravel.com/docs/eloquent#model-events – thpl

+0

你仔細閱讀了我的答案嗎? –

回答

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如果你是PHP> = 5.4。

+0

downvote的具體原因是什麼? – rmobis

+0

雖然你的答案確實提出了一個很好的選擇,但它並沒有回答原來的問題。 –

+0

夠公平的...... – rmobis

2

只有在調用save()方法時纔會觸發引導事件,而不是您正在使用的update()方法。

+0

那麼他應該怎麼做呢? –