2012-04-16 20 views
0

我正在嘗試記錄每個寫入操作,所以我在AppModel中使用afterSave和afterDelete回調。基本上我需要記錄(目前):模型,控制器功能,登錄用戶數據和遠程IP似乎我能夠得到所有這些,但我不知道如何獲得控制器功能名稱。 這是aftersave功能我現在有:AppModel aftersave,獲取控制器函數名稱

public function afterSave($created) { 
    App::uses('Folder', 'Utility'); 
    $month = date("y-m"); 
    if(!is_dir('../tmp/logs/'.$month)) { 
     $dir = new Folder('../tmp/logs/'.$month, true); 
    } 
    App::uses('CakeSession', 'Model/Datasource'); 
    $user_id = CakeSession::read('Auth.User.username'); 
    if($created) { 
     $id = 'New'; 
    } else { 
     $id = $this->data[$this->alias]['id']; 
    } 
    $str = 'WRITE Action. Model: '.$this->alias.'. Controller: functon_name. ID:'.$id.'. Username: '.$user_id.'. Client IP: '.$this->getIP(); 
    CakeLog::write($month.'/'.date("d-m-y"), $str); 
} 

感謝

回答

2

你的模型,它沒有控制的知識做這個(真的不應該)。我建議將CakeRequest對象複製到模型中,以便獲得該信息。這裏有一種方法:

//controller 
function beforeFilter() { 
    $this->{$this->modelClass}->request = $this->request; 
} 

然後你就可以從模型訪問請求對象。使用$this->request['params']['action']獲取當前的分派操作。

值得提示的是,您可能希望將其移至自定義數據源上的read()方法,因爲afterSave()可能會被跳過並因此未被記錄。

+0

謝謝你傑里米。我按照你的說法做了,我把代碼放在應用程序控制器之前。然而,問題是由於某種原因,我在$ this-> request ['params'] ['action']上有一個空輸出,所以我使用了$ this-> request-> action,它運行良好。你能否更好地解釋afterSave可以跳過的情況?再次感謝,這真的很有用。 – slacky 2012-04-16 17:42:52

+0

如果您在保存選項中傳遞''callbacks'=> false'''afterSave',可以跳過。行爲等可以修改,如果他們想。 – jeremyharris 2012-04-16 17:50:00

+0

明白了,再次感謝。 – slacky 2012-04-16 17:56:21