YII2 выполнение кода в каждом контроллере

В продолжении темы примитивного логгирования. Понадобилось записывать, какой пользователь открывает какие страницы. И если с клиентским отображением в принципе ничего сложного, просто вставил в /view/layouts/main.php код вида:

if (isset(Yii::$app->user->identity)){
  if (isset(Yii::$app->user->identity->username)){
    Logger::Log(Yii::$app->user->identity->username." >> ".$_SERVER["REQUEST_URI"]);
  }
};

Но, к сожалению оный не перехватывает вызов страниц, которые завершаются в контроллере. Ну например всякие ajax запросы на странице. Поступил чуть хитрее: создал свой компонент в папке components (требуется создать папку если нет):

<?php
namespace app\components;
use yii\base\Component;
use app\models\Logger;

class Logging_at_start extends Component{
    public function init() {
           Logger::Log(" >> ".$_SERVER["REQUEST_URI"]);
        parent::init();
    }
}   

И добавил/отредактировал в /config/web строчки:

...
'bootstrap' => ['log','Logging_at_start'],
...
    'components' => [
        'Logging_at_start'=>[
            'class'=>'app\components\Logging_at_start'
        ],        

Плюс добавил сохранение сессии в константу sess в web/index.php

Итого, в логах теперь красуется всё то нужно:

Примитивное логгирование в YII2

Иногда необходимо в проект добавить логгирование событий работы, однако не всегда удобно тащить для этого кучу сторонних библиотек. Тем более что особых требований и не нужно. Если достаточно что бы:

  • логи велись «стандартно» для системы на базе Linux, с автоматической ротацией и т.п.
  • особых тонкостей и настроек для вывода не нужно, достаточно просто текста

То вполне можно написать свою простенькую модель вида:

<?php
namespace app\models;
use Yii;

class Logger {
    
    const Error=1;
    const Info=2;
    const Warning=3;
    const Success=4;
    const Fail=5;
    
 public static function Log($message,$type=self::Info){
     $prefix="Info:";
     if ($type==self::Error)    $prefix="Error";
     if ($type==self::Info)     $prefix="Info";
     if ($type==self::Warning)  $prefix="Warning";
     if ($type==self::Success)  $prefix="Success";
     if ($type==self::Fail)  $prefix="Fail";
     /usr/bin/logger "(GEO) $prefix: $message";
 }   
}

И использовать её далее в любом месте в коде, например так:

        Logger::Log("-попытка авторизации в AD $username");        
        // авторизуемся в AD
        $ldapbind = @ldap_bind($ldap_con, $username."@".$value["ldap_server"], $password);                        
        if ($ldapbind==false) {
            Logger::Log("--ошибка",Logger::Fail);
            return null;            
        };
        Logger::Log("--ok",Logger::Success);

Логи можно будет наблюдать в стандартном /var/log/messages:P.S. Раньше тоже велосипедил с добавлением лога в отдельный файл, а потом подумал «А зачем?». В большинстве случаев достаточно так.