“Один” объект без singleton

117
27 декабря 2020, 16:00

Как можно по всему проекту использовать только 1 объект, не используя паттерн синглтон? Или это единственное решение?

Мне нужно решить следующую задачу:

$logger = new Monolog\Logger('someName');
$errHandler = new Monolog\ErrorHandler($logger);
$errHandler->registerErrorHandler(); 
$errHandler->registerExceptionHandler();
$errHandler->registerFatalHandler();
$logger->pushHandler(new Monolog\StreamHandler('logs.log'));
$logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
$logger->pushProcessor(new Monolog\Processor\MemoryPeakUsageProcessor());
$logger->pushProcessor(new Monolog\Processor\IntrospectionProcessor());
// ... и другие конфигурации логирования

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

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

Ранее мне предлагали создание экземпляра класса и его конфигурацию запихнуть в отдельный файл, и подключать где-нибудь в начале проекта. Мне такой вариант не нравится, т.к.объект будет инициализирован в любом случае, не важно, используется оно или нет. Т.е. необходим lazy-load.

Насколько я понимаю, хорошо бы первым делом обернуть конфигурацию и создание объекта логирования в какой-нибудь враппер?

Дальше если решить вопрос lazy-load через DI контейнер, то получится, при использовании (вытаскивании объекта логирования) из DI-контейнера в разных файлах проекта, будет каждый раз создаваться новый объект.. Это мне не мешает. Код будет и дальше работать, создавая новые объекты логирования. Но здравый смысл подсказывает, что это ни есть хорошо. Почему бы не использовать тот объект, который уже создан ?

Вопрос в следующем, как можно добиться такого результата? Уже задавал кучу разных вопросов тут.. Читал много статей про DI-контейнеры. Но никто не смог внятно объяснить.. Как можно добиться такого результата, что для этого нужно сделать.

По сути, всю проблему решит singleton-wrapper (в котором буду создавать объект логирования и конфигурировать его). Как можно тоже самое сделать без синглтона?

И еще, "вопрос в вопросе", когда мы используем DI-контейнер, то получается, что он не 1 для всего проекта? В каждом файле проекта нужно его заного объявлять и задавать сервисы и их зависимости? Есть ли какие-то решение, чтобы можно было в начале проекта описать свои сервисы из сконфигурировать, и использовать так где это необходимо?

Большая просьба помочь, объяснить как это работает. Уже не первую неделю ищу ответы на свои вопросы. Буду благодарен!

Answer 1

Все зависиот от структуры проекта.

Если это классическое спагетти, отдельные похапе файлы на каждую операцию, то синглетон будет самой меньшей из проблем. Используй на здоровье.

Если это классическая "MVC" иерархия с кдиной точкой входа, где объекты создаются на лету ядром, то вот при этом создании и используем объекты из контейнера.

READ ALSO
Почему Observable не является интерфейсом?

Почему Observable не является интерфейсом?

Почему в java Observable является именно классом, а не интерфейсом?

104
Выделение графика на изображении

Выделение графика на изображении

Какие есть способы обработки изображения для выделения графика? То есть из изображения с графиком нужно отделить график от сетки и фона

141
Не выходит форма регистрации

Не выходит форма регистрации

я делаю регистрацию для приложения, связал с БД, всё вроде нормально, так же использовал готовое решение от ФейсбукаСуть в чём, при регистрации,...

138
Date выдает неверные результаты

Date выдает неверные результаты

Данный пример кода выводит

122