#yii2 #audit
#yii2 #аудит
Вопрос:
Я пытаюсь вставить запись в свою таблицу аудита при обновлении записи в любой другой таблице. Например, если пользователь обновляет свой профиль, я хочу сохранить старую запись и вновь обновленную запись в моей таблице аудита. Для этого в моей пользовательской модели я пытаюсь использовать beforeSave() и передать значение моему контроллеру аудита
public function beforeSave($insert)
{
if((parent::beforeSave($insert))){
// Place your custom code here
$query = DepCustomer::findOne($this->customer_id);
Yii::$app->runAction('audit-trial/createaudit', ['query' => $query]);
return true;
}
}
И код действия в контроллере аудита на данный момент
public function actionCreateaudit($query)
{
$model = new Audit();
$model->old = '';
foreach($query as $name => $value){
//$temp = $name .': '. $value.', ';
//$contentBefore[] = $temp;
$audit->old = $audit->old.$name .': '. $value. ', ';
}
// I've not yet any other code for now I'm trying to get the old value
$model->save();
}
Я получаю ошибку 404 not found. Что мне нужно изменить в моем коде, чтобы он заработал? Спасибо!
Комментарии:
1. есть ли у вас какая-либо особая логика в действии «createaudit», если нет, почему бы не сохранить запрос в методе beforesave . если у вас есть специальная логика, лучше перенести ее в модель «AuditTrial», и тогда вы сможете вызвать ее из любого места в вашем коде
2. Да! это правда. Я могу сохранить старые и новые обновленные данные в методе beforesave или в действии обновления контроллера клиента, и я достиг этого. Теперь я пытаюсь сохранить запись аудита и для другой модели. Итак, я пытаюсь написать код для передачи старого значения в методе beforesave, чтобы я мог поместить код и в другую модель.
Ответ №1:
вместо runAction()
. Если вы хотите выполнить операцию на другой модели, предпочтите создать статическую функцию в этой модели (в вашем случае Audit
модели) для сохранения данных
public function beforeSave($insert)
{
if((parent::beforeSave($insert))){
// Place your custom code here
$query = DepCustomer::findOne($this->customer_id);
Audit::saveOldDetails($query);
return true;
}
}
и записывает saveOldDetails
функцию в Audit Model
public static saveOldDetails($query){
// your business logic here
}
Обратитесь к этой ссылке
http://www.yiiframework.com/doc-2.0/yii-base-controller.html#runAction ()-подробно
Комментарии:
1. Привет! с помощью этого метода одна и та же запись вставляется в таблицу аудита несколько раз. Примерно 3 раза. Я пытался выяснить, что является причиной этого, но не смог найти причину. Есть идеи, что может быть причиной этого?
2.
beforeSave
будет выполняться для каждого метода сохранения.3. ОК. Не знал этого. В моем действии обновления есть несколько save().