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
War es hilfreich?

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

http://Framework.Zend.com/Manual/2.2/de/modules/zend.mvc.services.html#zend-log-loggerabstractServiceFactory

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top