Преднастройка объекта перед использованием

fawkes

Новичок
Есть объект логгирования, который перед использованием так или иначе настраивается:
пример:
PHP:
//первый настроенный объект логгера
$log1 = new Logger($param1, $param2);
$log1->setHandler(FileHandler::class);
$log1->setChannel('FooBarProjectOne');

//второй
$log2 = new Logger($param1, $param2);
$log2->setHandler(FirePHPHandler::class);
$log2->setChannel('FooBarProjectTwo');

//затем предлагается использовать их вот так:

$log1->error('this some error');
$log2->info('more useful information', $context = []);
былобы прекрасно положить оба настроенных логгера в контейнер и использовать при необходимости...

Что делать, если встроенного контейнера в проекте нет? Писать очередной Singleton?

Или еще хуже, использовать контейнер совместно с объектом логгирования, а затем предоставить доступ к хранилищу через singleton .......

В общем вопрос, куда девать настроенные объекты $log1 и $log2?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Вангую, сейчас наберуг DICK-head умалишенные и будут учить жить. Но суть в чем, как вы раньше обращались к глобально-нужным классам?
 

fawkes

Новичок
Но суть в чем, как вы раньше обращались к глобально-нужным классам?
Раньше я использовал фреймворк Kohana, где все на статике. Все ограничивалось модулями, фабриками и парой-тройкой классов в папке classes. Тогда я не писал собственных либ и не думал об этом. Жуть. Вот отучаюсь.

Что думаете по сабжу? Подумываю использовать Registry...
 
Последнее редактирование:

ksnk

прохожий
fawkes, в бейсике, в староглиняные времена, были "файлы" до которых можно было добраться по номеру... Чем не идея?
В конфигурации настраивается логер нумер X, функция лога может указать конкретный номер, если это нужно.

Логер, желательно, сделать слабозависимым от остальных классов проекта. Неясно ведь, когда и в каком состоянии приложения придет в голову записать что-то в лог.

Что не нравится в статических классах?
Или еще хуже, использовать контейнер совместно с объектом логгирования
А что плохого?
PHP:
 $log2 = Logger::get([
                  'handler':FirePHPHandler::class,
                  'channel':'FooBarProjectTwo',
         ],$param1, $param2);
Сам класс будет хранить открытые логеры и заботится о них по мере сил... в деструкторе.
 

Вурдалак

Продвинутый новичок
fawkes, если у тебя нет возможности нормально прикидывать зависимости в legacy-часть кода, то вполне можно иметь какой-нибудь LoggerProvider/LoggerLocator, который внутри обращается к контейнеру. Для нового кода можно будет инжектить.
 
Сверху