Yii2 передает результат запроса действию в другом контроллере

#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().