@akula22

Как мне логгировать действия модераторов на сайте через события?

Я хочу логгировать все что делают модераторы на сайте, например когда они отредактировали новость, или удалили комментарий, создали тему форума и тд.
Скажите как мне это сделать, я хочу записывать кто сделал, что сделал, когда, где, во сколько.
Это делать через стандартные события? afterSave afterDelete ? расскажите поподробнее пожалуйста.
Как мне это видится, просто в нужный экшен вставляю код, типа Log($model);
и где-то это все записывается в базу
  • Вопрос задан
  • 140 просмотров
Пригласить эксперта
Ответы на вопрос 1
@melnikov_m
Везде и всюду вставлять Log($model); - это не правильный ход. Логика размазывается по всем моделям.
Лучше написать отдельные модуль и с помощью событийвсе решить.
Как пример..
в компоненте модуля логов, который подключаю в конфиге примерно вот так
'logs' => [
            'class' => common\modules\logs\components\Log::className(),
        ],


пишу...
namespace common\modules\logs\components;

class Log extends Event
{
    /**
     * @inheritdoc
     */
    public function init()
    {
       // Слушаем события моделей. Если событие произошло, то обрабатываем его в builderUser
        self::on(User::className(), User::EVENT_AFTER_LOGIN, [$this, 'builderUser']);
        self::on(User::className(), User::EVENT_BEFORE_LOGOUT, [$this, 'builderUser']);
......


функция builderUser имеет вот такой вид..
/**
     * Построитель событий пользователей
     *
     * @param mixed $event Событие
     *
     * @return void
     */
    public function builderUser($event = null)
    {
        switch ($event->name) {
            case User::EVENT_AFTER_LOGIN: // Авторизация
                if ($event->sender->identity->isAdmin()) { // Админ
                    $this->addEvents(LogEvents::EVENT_AUTHORIZATION_ADMINISTRATOR, $event->sender->identity);
                } elseif ($event->sender->identity->isSeller()) { // Продавец
                   .....
                } elseif (...) { // Другие пользователи системы
                   .....
                } 
                break;
            case User::EVENT_BEFORE_LOGOUT: // Выход из ЛК
                if ($event->sender->identity->isAdmin()) { // Админ
                    $this->addEvents(LogEvents::EVENT_LOGOUT_ADMINISTRATOR, $event->sender->identity);
                } elseif ($event->sender->identity->isSeller()) {  // Продавец
                 ......
                }


а функция addEvents уже непосредственно записывает тип события, событие и сам лог в базу
LogEvents - это обычная моделька со списком событий и типов событий.

Код вырвал из контекста, полный список приводить нет возможности, но думаю сама суть ясна.

1) Слушаем событие модели
2) обрабатываем событие в зависимости от прав пользователя и типа события(вход, выход, осуществление покупки, удаление товара и прочее)

UPD
структура модуля
a35e5f669a014cf7bda8727238929f88.jpg
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы