В настоящее время я экспериментирую с Auryn и пытаюсь сделать конкретный экземпляр регистратора Monolog доступным везде посредством внедрения зависимостей. Кодовая база, с которой я работаю, использует PSR LoggerAwareInterface, чтобы указать, что в класс может быть введен логгер (через setlogger).
Я пытаюсь настроить его следующим образом:
$logger = new Logger ("myApp", [new SyslogHandler ("myAppLog", LOG_USER, Logger::DEBUG)]);
$auryn = new Injector ();
$auryn -> share ($logger);
$auryn -> prepare (LoggerAwareInterface::class, function (LoggerAwareInterface $client)
{
$client -> setLogger ($this -> make (Logger::class));
});
Тем не менее, это не работает, потому что $ this не в объектном контексте (хотя PHP 5.4 должен поддерживать использование $ this в замыкании).
Я также попытался написать это следующим образом.
$auryn -> prepare (LoggerAwareInterface::class, function (LoggerAwareInterface $client) use ($logger)
{
$client -> setLogger ($logger);
});
Это работает, если $logger
существует в области, где $auryn -> prepare ()
звонок сделан, но мне это совсем не нравится, потому что сейчас требуется $logger
существовать вне Auryn, что фактически делает его глобальным состоянием и, по-видимому, в первую очередь побеждает точку контейнера внедрения зависимостей. Я бы предпочел поделиться регистратором в Auryn, а затем использовать общий экземпляр внутри обратного вызова.
Поскольку я новичок в Auryn, может быть очевидное решение, которое я пропускаю. Если так, то что я тут не так делаю?
Задача ещё не решена.
Других решений пока нет …