Как использовать глобальную константу вместо константы класса в версии PHP 5.6 - PullRequest
0 голосов
/ 17 мая 2019

Я использую Monolog для создания системы регистрации моего приложения.В основном файле приложения после создания нового объекта Monolog мне нужно выбрать уровень журнала, который я хочу распечатать, в файле журнала.Я хочу использовать глобальную константу LOG_LEVEL, которая может быть 'DEBUG', 'INFO' и т. Д. Мне нужно, чтобы класс Monolog обрабатывал его значение как константу класса.

// content of config.php
// Here I declare the constants in a separate file called 'config.php'
define("LOG_FILE", "patch/to/my/log.log");
define("LOG_LEVEL", "ERROR");

// content of app.php
require 'config.php';
require 'vendor/autoload.php';

$container['logger'] = function($c) {
    $logger = new \Monolog\Logger('logger');
    error_log('log level ' . LOG_LEVEL); // prints 'log level ERROR'

    $fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::LOG_LEVEL); // here I get the error 'Undefined class constant LOG_LEVEL'
    //the normal syntax would be '$logger::ERROR' in this case and that works fine

    $logger->pushHandler($fileHandler);
    return $logger;
};

Мне нужен 'Константа LOG_LEVEL 'будет использоваться как' ERROR 'монологическим классом, а не как' LOG_LEVEL '.Что я здесь не так делаю, искал ответ часами без всякой удачи.

Ответы [ 4 ]

1 голос
/ 17 мая 2019

Вы сейчас делаете $logger::LOG_LEVEL, что выводит LOG_LEVEL из класса в зависимости от того, $logger (в данном случае \Monolog\Logger).В нем нет статической переменной с именем LOG_LEVEL, поэтому вы получаете неопределенное значение.
У вас есть только что определенное значение LOG_LEVEL из любого класса, поэтому:

 $fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, LOG_LEVEL); 

Необычное решение:

Вы можете создать статический класс и включить его в свою главную страницу:

Class CONFIG {
    public static $LOG_LEVEL = 'default Value';
}

// Then you can use this anywhere:
CONFIG::$LOG_LEVEL
$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, CONFIG::$LOG_LEVEL); 

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

0 голосов
/ 17 мая 2019

Вы делаете это более сложным, чем нужно. Monolog имеет функцию для преобразования уровня ошибки в виде строки в его собственное внутреннее значение. Просто измените свой код на это:

$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::toMonologLevel(LOG_LEVEL));
0 голосов
/ 17 мая 2019

Создайте статический класс и включите его ...

class GLOBALCONF{
    public static $VALUE= 'Something in here';
}

// Use it where you want
GLOBALCONF::$VALUE
0 голосов
/ 17 мая 2019

Вы также можете использовать Logger::getLevels(), как показано ниже:

$log_level = $logger->getLevels()[LOG_LEVEL];
$fileHandler = new ...StreamHandler(LOG_FILE, $log_level);
...