So registrieren Sie eine Zend \ Log Instanz im ServiceManager in ZF2
-
12-12-2019 - |
Frage
Ich frage mich, wie man eine Logger-Instanz am besten über den ServiceManager in ZF2 initiiert und wiederverwendet.Natürlich kann ich eine einfache Methode anwenden, die in jeder Klasse verwendet werden kann, wie zum Beispiel:
public function getLogger () {
$this->logger = new Logger();
$this->logger->addWriter(new Writer\Stream('/log/cms_errors.log'));
return $logger;
}
aber ich habe mich gefragt, wie man eine ähnliche Struktur im Globalen am besten registriert.PHP.Bisher kann ich
fügen Sie global Folgendes hinzu.PHP
'Zend\Log'=>array(
'timestampFormat' => 'Y-m-d',
array(
'writerName' => 'Stream',
'writerParams' => array(
'stream' => '/log/zend.log',
),
'formatterName' => 'Simple',
),
),
Wenn ich versuche, es aufzurufen durch:
$this->getServiceLocator()->get('Zend\Log')
Ich bekomme eine :
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Log
Lösung
Fügen Sie die folgenden Daten auf 'global.php'
hinzu generasacodicetagpre.und dann können Sie anrufen
generasacodicetagpre.Andere Tipps
Alternativ und eleganter können Sie einen Protokoll-Listener einrichten und Ihren Logger von Ihrer App entkoppeln.Der EventManager
ist eine sehr leistungsfähige Komponente und ZF2 ist jetzt im Grunde ein ereignisgesteuertes Framework.
In Ihrem module.php
sie könnten etwas hinzufügen wie:
// Setup the Zend Logger, pseudocode
$logger = new Logger;
$writer = new Writer;
$logger->addWriter($writer);
// Attach a logging listener for the log event on application level, working code
$events = StaticEventManager::getInstance();
$events->attach('*', 'log', function($event) use ($logger) {
$target = get_class($event->getTarget());
$message = $event->getParam('message', 'No message provided');
$priority = (int) $event->getParam('priority', Logger::INFO);
$message = sprintf('%s: %s', $target, $message);
$logger->log($priority, $message);
});
Dann von überall, z.von einem Controller aus können Sie Folgendes tun:
$this->getEventManager()->trigger('log', $this, array(
'priority' => 7,
'message' => 'some log message'
));
Verwenden Sie möglicherweise das abstrakte Logger-Werk für die Konfiguration anstelle der normalen Fabrik
generasacodicetagpre.Bitte versuchen Sie es erneut mit dem absoluten Pfad \
generasacodicetagpre.Ich habe in meinem Bootstrap ein Standard-Datenbankschreiber-Objekt erstellt und in der Servicemanager registriert.
generasacodicetagpre.Der AbstractController ist eine Instanz von "serviceelocatorawarsinterface".Ich kann also nur in meinem Controller anrufen
generasacodicetagpre.