как реализовать журнал действий

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

как реализовать журнал действий

Сообщение svil » 2019.06.24, 22:28

Как реализовать в yii2 запись действий пользоателей, то есть зашел пользователь Иванов в свой кабинет, создал запись, в журнале запись создается c датой и временем. И так по всем контроллерам и видам с привязкой к пользователю. Отслеживаются действия пользователя и заносятся в журнал.

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

Re: как реализовать журнал действий

Сообщение masson » 2019.06.25, 04:39

Отлавливаем событие EVENT_BEFORE_ACTION у приложения и ведем нужные логи

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 15:55

Eсть таблица Events для записи событий(id, company_id, content, timecreate )
Есть таблица Companies для организаций (id, name)
Есть таблица users (id, name, ...)
User добавил запись в таблицу companies и в таблице events должна быть записана запись об этом.
И как это все в events таблицу записать?
Последний раз редактировалось svil 2019.06.27, 16:52, всего редактировалось 2 раза.

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 16:04

События состоят из следующего цикла.

1 Определяю событие: регистрация действий пользователя(таблица users).
2 Добавление константы в модель User. Например, const EVENT_ACT_USER='act_user'; Это используется для добавления обработчиков и для запуска события.
3 Определяю метод(обработчик), который должен что-то делать, когда происходит событие. В моем случае, запись в БД events. У него должен быть параметр $event.
4 Присоединяю этот обработчик к model используя метод on(). Можно прикрепить более одного обработчика к одному событию.
5 Инициирую событие, используя trigger().

Обработчик и метод on являются частью класса Component.
Как в БД записать в таблицу events в поле content строку "Добавление Организации - companies.name- id пользователя-имя пользователя"?
Модель User

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use common\models\User as UserAlias;
use yii\base\Component;

class User extends \yii\db\ActiveRecord
{
    const EVENT_ACT_USER='act_user';

   
    public static function tableName()
    {
        return 'users';
    }

    public function getEvent($event){

    $ev=new \app\models\Events();
    $ev->content= $this->getPrimaryKey().$this->surname;

    return $ev->save() ? $ev : null

    }

    public function init(){

        $this->on(self::EVENT_ACT_USER, [$this, 'getEvent']);
        parent::init(); 
    }

}
В контроллере CompaniesController

Код: Выделить всё

 public function actionCreate()
    {
        $model = new Companies();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $model->trigger(User::EVENT_ACT_USER);
            return $this->redirect(['view', 'id' => $model->id]);

        }

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 16:56

Может нужно в отдельной папке components события описывать?

Код: Выделить всё

namespace app\components;

use yii\base\Component;
use yii\base\Event;

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 17:39

Не записывает.

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use common\models\User;
use yii\base\Component;
use app\models\Events;


use yii\base\Event;


class Useventer extends  Component
{
    const EVENT_ACT_USER='act_user';



    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'users';
    }



    public function getEvent($event){
        $ev=new \app\models\Events();
        $ev->content= $this->getPrimaryKey().$this->surname;
        $ev->save();
       // return $ev->save() ? $ev : null;
    }

    public function init(){

        $this->on(self::EVENT_ACT_USER, [$this, 'getEvent']);
        parent::init(); // DON'T Forget to call the parent method.
    }



}

Аватара пользователя
ElisDN
Сообщения: 5408
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: как реализовать журнал действий

Сообщение ElisDN » 2019.06.27, 17:43

Код: Выделить всё

Event::on(User::class, User::EVENT_ACT_USER, [$this, 'getEvent']);

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 18:11

Контроллер companies

Код: Выделить всё

 public function actionCreate()
    {
        $model = new Companies();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            Event::on(User::class, User::EVENT_ACT_USER, [$this, 'getEvent']);
            return $this->redirect(['view', 'id' => $model->id]);

        }
        if($model->save()){
            $model->trigger(Useventer::EVENT_ACT_USER);

        }
        return $this->render('create', [
            'model' => $model,
        ]);
    }
Последний раз редактировалось svil 2019.06.27, 18:53, всего редактировалось 2 раза.

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 18:20

User (модель)

Код: Выделить всё

 public function getEvent($event){
    $ev=new \app\models\Events();
    $ev->content= $this->getPrimaryKey().$this->surname;
        return $ev->save() ? $ev : null;
    }

    public function init(){
    
 Event>on(self::EVENT_ACT_USER, [$this, 'getEvent']);
        parent::init(); // DON'T Forget to call the parent method.
    }
Как в контроллере companies при создании вызвать триггер?

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 22:01

https://www.yiiframework.com/doc/guide/ ... ept-events

Код: Выделить всё

объект Active Record инициирует событие EVENT_AFTER_INSERT после добавления в базу данных новой записи. Чтобы отслеживать записи, добавленные в базу данных каждым объектом Active Record, можно использовать следующий код:

use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;

Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
    Yii::debug(get_class($event->sender) . ' добавлен');
});
Как это в коде?

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.27, 22:54

пока никак

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.28, 09:07

Добавила в events записи без триггеров при добавлении Организации или Пользователя
код //1-//4 ниже. Итог тот же. И так по нужным контроллерам, где crud дописать.

Код: Выделить всё

//При добавлении организации в backend/controllers/CompaniesController
public function actionCreate()
{
    $model = new Companies();
    $ev =new Events(); //1
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        $ev->content='Создание организации:'.trim(Yii::$app->user->identity->surname); //2
        $ev->company_id = $model->id;//3
        $ev->save();//4
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('create', [
        'model' => $model,
    ]);
}
//При добавлении пользователя в модели common/models/SignupForm
public function signup()
{
    if ($this->validate()) {
        $user = new User();
        $job = new Jobs();
        $ev = new Events(); //1

        $user->setPassword($this->password);
        $user->password= $user->setPassword2($this->password,$user->password_hash);
        $user->generateAuthKey();

        $user->surname = $this->surname;
        $user->name = $this->name;
        $user->thirdname = $this->thirdname;

        $user->basket = $this->basket;

        $user->save(true);
        $job->user_id=$user->getId();
        $job->company_id = $this->id_companies;
        $job->name =  $this->job;
        $job->save();

        $ev->content='Создание пользователя'.$this->surname.trim(Yii::$app->user->identity->surname) ; //2
        $ev->company_id = $this->id_companies; //3
        $ev->save(); //4

       
        $auth = Yii::$app->authManager;
        $authorRole = $auth->getRole('author');
        $auth->assign($authorRole, $user->getId());

        return $user;
    }

    return null;
}



Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.28, 09:10

Но с триггерами надо разобраться

Аватара пользователя
svil
Сообщения: 547
Зарегистрирован: 2018.02.12, 22:41

Re: как реализовать журнал действий

Сообщение svil » 2019.06.28, 15:45

https://www.youtube.com/watch?v=KKilbiod7yM&t=307s
нормально объясняет

Ответить