2012-04-16 16 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']を使用してください。

afterSave()はスキップされ、ログに記録されない可能性があるため、これをカスタムデータソースのread()メソッドに移動することをお勧めします。

+0

ありがとう、ジェレミー。あなたが言ったように、私はbeforefilterのコードをアプリケーションコントローラに入れました。しかし問題は何らかの理由で$ this-> request ['params'] ['action']で空の出力があったため、app- modelでは$ this-> request-> actionをうまく使っていました。 afterSaveがスキップされる可能性がある場合は、よりうまく説明できますか?再びありがとう、本当に便利でした。 – slacky

+0

'afterSave'は、' 'callbacks '=> false'を保存オプションに渡すとスキップできます。彼らが望むなら、行動などはこれを修正することができます。 – jeremyharris

+0

もう一度、ありがとう。 – slacky

関連する問題