AppModel после сохранения, получить имя функции контроллера

Я пытаюсь регистрировать каждую операцию записи, поэтому использую обратные вызовы afterSave и afterDelete в AppModel. В основном мне нужно зарегистрировать (на данный момент): модель, функцию контроллера, данные пользователя, вошедшего в систему, и удаленный IP-адрес. Кажется, я смог получить их все, но я не знаю, как получить имя функции контроллера. . Это функция после сохранения, которая у меня есть сейчас:

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);
}

Спасибо


person slacky    schedule 16.04.2012    source источник


Ответы (1)


Вы делаете это на модели, которая ничего не знает о контроллере (и действительно не должна). Я предлагаю скопировать объект CakeRequest в модель, чтобы у вас была эта информация. Вот один из способов:

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

Затем вы можете получить доступ к объекту запроса из модели. Используйте $this->request['params']['action'], чтобы получить текущее отправленное действие.

Стоит предположить, что вы, возможно, захотите переместить это в метод read() в пользовательском источнике данных, поскольку afterSave() может быть пропущен и, следовательно, не зарегистрирован.

person jeremyharris    schedule 16.04.2012
comment
Спасибо, Джереми. Я сделал, как вы сказали, я поместил код перед фильтром в контроллер приложения. Однако проблема заключалась в том, что по какой-то причине у меня был пустой вывод для $this-›request['params']['action'] в модели приложения, поэтому я использовал $this-›request-›action, который работал хорошо. Можете ли вы лучше объяснить, в каких случаях можно пропустить afterSave? Еще раз спасибо, это было действительно полезно. - person slacky; 16.04.2012
comment
afterSave можно пропустить, если вы передадите 'callbacks' => false в параметрах сохранения. Поведение и т. д. могут изменить это, если захотят. - person jeremyharris; 16.04.2012