Kernpunkte
log()
-Methode, die alle Schweregradniveaus empfangen kann. Sein Design besteht darin, das Problem der Inkompatibilität der Protokollimplementierung zu lösen. AbstractLogger
-Kläufe erweitern. Bei der PHP -Entwicklung ist die Protokollierung eine der häufigsten Aufgaben. Wir verwenden Protokolle, um Fehlermeldungen zu verfolgen, wichtige Ereignisse zu protokollieren und Codeprobleme zu debugieren. In jedem PHP -Projekt kann der Code mit Anrufen an Protokollbibliotheken gefüllt werden, die diese Vorgänge für uns verarbeiten. Leider sind Anrufe bei Protokollbibliotheken im gesamten Code verstreut, wodurch der Code von der Verfügbarkeit der Bibliothek abhängt, was eindeutig dem Prinzip der Abhängigkeitsinversion widerspricht. Auch wenn wir die Abhängigkeitsinjektion verwenden, um unsere Objekte auf die Protokollbibliothek zugreifen zu lassen, kann der Unterschied zwischen Protokollbibliotheken bedeutet, dass das Wechsel zwischen ihnen schwierig und zeitaufwändig sein kann und ein großes Neuaufbau der gesamten Codebibliothek erforderlich ist. Um die Kompatibilität zwischen Protokollbibliotheken zu verbessern, hat das PHP-Fig-Team kürzlich PSR-3 veröffentlicht, eine gemeinsame Schnittstelle für Protokollobjekte. In diesem Artikel werde ich diskutieren, wie die von PSR-3 definierte Protokollschnittstelle es uns ermöglicht, wiederverwendbaren Code zu schreiben, der nicht von einer bestimmten Protokollimplementierung abhängt.
psr-3 schnelles Start
Bevor wir verstehen, wie PSR-3 unseren Code wiederverwendbarer macht, ist es notwendig zu verstehen, was PSR-3 ist. Wenn Sie mit PSR-3 bereits vertraut sind, können Sie diesen Abschnitt überspringen. Der Kern der Spezifikation ist die Schnittstelle zu Protokollobjekten. Diese Schnittstelle gibt acht Möglichkeiten, Meldungen unterschiedlicher Schweregradniveaus und eine gemeinsame Methode zu verarbeiten, die alle Schweregradniveaus akzeptieren kann. Die von PSR-3 unterstützten acht Schweregraden basieren auf RFC 5424, wie nachstehend beschrieben: log()
emergency
- Das System kann nicht verwendet werden alert
- Aktion ist erforderlich critical
- ernsthafte Situation error
- Fehler, die keine sofortige Aufmerksamkeit benötigen, aber überwacht werden sollten warning
- Ein ungewöhnliches oder unerwünschtes Ereignis, aber kein Fehler notice
- normale, aber wichtige Ereignisse info
- Interessante Ereignisse debug
- Details zum Debuggen Jede Protokollmethode akzeptiert eine Nachricht, die eine Zeichenfolge oder ein Objekt mit einer __toString()
-Methode sein muss. Zusätzliche Parameter akzeptieren ein Array, mit dem Kontextinformationen für Protokollnachrichten bereitgestellt werden können. Eine vollständige Beschreibung dieser Methoden und Parameter finden Sie in der PSR-3-Spezifikation.
PSR-3-Datei
abrufen Das Erhalten der Dateien, die Sie für die Verwendung von PSR -3 benötigen, ist einfach - Sie können sie im PSR/Protokoll -Github -Repository finden. Sie können auch Komponist verwenden, um diese Dateien von Packagist zu erhalten. Hier ist ein Beispiel für eine composer.json
-Datei zum Abrufen von PSR/Protokolldateien:
{ "require": { "psr/log": "dev-master" } }
So begrenzen Sie die Wiederverwendung der Code -Protokollierung
PHP verfügt über viele verschiedene Protokollbibliotheken, jeweils eine eigene Art, Daten zu sammeln und aufzuzeichnen. Obwohl sie einige Gemeinsamkeiten haben, verfügt jede Bibliothek über ihre einzigartigen Protokollierungsmethoden. Dies bedeutet, dass das Umschalten zwischen Protokollen eine Herausforderung sein kann und häufig den Code ändern muss, wo die Protokollierung verwendet wird. Dies entspricht dem soliden Prinzip der Code-Wiederverwendung und des objektorientierten Designs. Die Situation, mit der wir konfrontiert sind, ist, dass entweder Abhängigkeiten für bestimmte Protokollbibliotheken deklariert werden oder sich insgesamt vermeiden. Um dieses Problem klarer zu veranschaulichen, ist ein bestimmtes Beispiel erforderlich. Angenommen, wir erstellen ein einfaches Mailer -Objekt, um das Senden von E -Mails zu verarbeiten. Wir möchten, dass Mailer jedes Mal, wenn wir eine E -Mail senden, eine Nachricht protokolliert, und wir beschlossen, die hervorragende Monologbibliothek zu verwenden, um unsere Protokollierungsanforderungen zu erfüllen.
<?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 $this->logger->addInfo("Email sent to $emailAddress"); } }
Wir können diese Klasse mit dem folgenden Code verwenden:
<?php // 创建一个Monolog对象 $logger = new Monolog\Logger("Mail"); $logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log")); // 创建邮件发送器并发送电子邮件 $mailer = new Email\Mailer($logger); $mailer->sendEmail("email@example.com");
Ausführen dieses Codes erstellt einen neuen Eintrag in der Datei mail.log
und erfasst die gesendete E -Mail. Zu diesem Zeitpunkt könnten wir denken, dass wir ein wiederverwendbares Mailer -Objekt geschrieben haben. Wir verwenden die Abhängigkeitsinjektion, um den Protokoll für Mailer verfügbar zu machen, damit wir verschiedene Logger -Konfigurationen austauschen können, ohne unseren Mailer -Code zu berühren. Es sieht so aus, als hätten wir dem soliden Prinzip erfolgreich verfolgt und vermieden, harte Abhängigkeiten zu schaffen. Nehmen wir jedoch an, wir möchten die Mailer -Klasse in verschiedenen Projekten wiederverwenden, indem wir analog zur Behandlung von Protokollierungsinteraktionen verwendet werden. Jetzt haben wir ein Problem, weil Analog keine addInfo()
-Methode hat. Um mithilfe von Analog über Nachrichten auf Informationsebene aufzuzeichnen, nennen wir Analog::log($message, Analog::INFO)
. Wir können die Mailerklasse so ändern, dass die analoge Methode wie unten gezeigt verwendet wird.
<?php namespace Email; class Mailer { public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 Analog::log("Email sent to $emailAddress", Analog::INFO); } }
Wir können die aktualisierte Mailerklasse mit dem folgenden Code verwenden:
{ "require": { "psr/log": "dev-master" } }
Während dies funktionieren wird, ist es alles andere als ideal. Wir haben die Abhängigkeit von Mailer von einer bestimmten Protokollierungsimplementierung begegnet, bei der die Klasse bei der Einführung eines neuen Loggers geändert werden muss. Dies macht die Klasse weniger wiederverwendbar und zwingt uns, sich zwischen der Verfügbarkeit eines bestimmten Loggers zu entscheiden oder die Protokollierung in der Klasse insgesamt aufzugeben.
Verwenden Sie PSR-3, um Logger-Abhängigkeiten zu vermeiden
Wie Alejandro Gervasio in seinem hervorragenden Artikel zu diesem Thema erklärt, sagt uns das Prinzip der Abhängigkeitsinversion, dass wir uns eher auf Abstraktion als auf konkrete Implementierungen verlassen sollten. Bei der Protokollierung war unser aktuelles Problem das Fehlen einer geeigneten Abstraktion, auf die man sich verlassen kann. Hier kommt PSR-3 ins Spiel. PSR-3 wurde entwickelt, um die Inkompatibilität der Protokollierungsimplementierung zu überwinden, indem eine gemeinsame Schnittstelle für den Logger bereitgestellt wird (ordnungsgemäß als LoggerInterface
). Durch die Bereitstellung einer Schnittstelle, die nicht an eine bestimmte Implementierung gebunden ist, ermöglicht PSR-3 es uns, es zu vermeiden, auf einen bestimmten Protokoll zu stützen. Stattdessen können wir die Eingabeaufforderung für LoggerInterface
eingeben, um einen PSR-3-konformen Logger zu erhalten. Ich habe die folgende Mailerklasse aktualisiert, um dies zu demonstrieren:
<?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 $this->logger->addInfo("Email sent to $emailAddress"); } }
-Konstruktor wurde so geändert, dass der LoggerInterface
-implementierer akzeptiert wird, und die sendEmail()
-Methode nennt nun die in PSR-3 angegebene info()
-Methode. Das Monolog ist bereits PSR-3-konform, und Analog bietet ein Wrapper-Objekt, das LoggerInterface
implementiert, sodass wir diese beiden Holzfäller jetzt verwenden können, ohne die Mailer-Klasse zu ändern. Hier erfahren Sie, wie Sie diese Klasse mit Monolog nennen:
<?php // 创建一个Monolog对象 $logger = new Monolog\Logger("Mail"); $logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log")); // 创建邮件发送器并发送电子邮件 $mailer = new Email\Mailer($logger); $mailer->sendEmail("email@example.com");
und analog verwenden:
<?php namespace Email; class Mailer { public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 Analog::log("Email sent to $emailAddress", Analog::INFO); } }
Jetzt können wir unser Mailer -Objekt mit einer Bibliothek verwenden, ohne die Mailerklasse zu bearbeiten oder die Art und Weise zu ändern, wie wir sie verwenden.
Verwenden Sie den Adaptermodus für Holzfäller, die PSR-3
nicht unterstützen Bisher haben wir das Mailer -Objekt erfolgreich von einer bestimmten Protokollierungsimplementierung über den Implementierer entkoppelt, der LoggerInterface
beantragt. Aber was ist mit diesen Holzfällern, die für die PSR-3-Unterstützung noch nicht hinzugefügt wurden? Beispielsweise ist die beliebte Klogger-Bibliothek seit einiger Zeit nicht mehr aktualisiert und ist derzeit mit PSR-3 nicht kompatibel. Glücklicherweise können wir die durch Klogger ausgesetzten Methoden leicht auf die in LoggerInterface
definierten Methoden abbilden, indem wir das Adaptermuster nutzen. Unterstützte Dateien im PSR/Protokoll -Repository ermöglichen es uns, Adapterklassen einfach zu erstellen, indem wir eine AbstractLogger
-Klasse bereitstellen, die wir erweitern können. Eine abstrakte Klasse leitet einfach acht Ebenenspezifische Protokollmethoden weiter, die in LoggerInterface
zu einer gemeinsamen log()
-Methode definiert sind. Durch Erweiterung der AbstractLogger
-Klasses und definiere unsere eigene log()
-Methode können wir problemlos PSR-3-konforme Adapter für Holzfäller erstellen, die PSR-3 nicht nativ unterstützen. Ich werde dies unten demonstrieren, indem ich einen einfachen Adapter für Klogger erstelle:
{ "require": { "psr/log": "dev-master" } }
log()
-Methode ordnet einfach die LoggerInterface
-Methode der jeweiligen Klogger -Methode ab, und die Klogger übernimmt die tatsächliche Protokollierungsaktivität. Indem wir die Klogger -Klasse auf diese Weise einwickeln, können wir sie verwenden, ohne den LoggerInterface
-Vertrag zu brechen. Wir können jetzt den Klogger -Adapter mit der Mailerklasse verwenden:
<?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 $this->logger->addInfo("Email sent to $emailAddress"); } }
Mit der Adapterklasse können wir Klogger verwenden, ohne die Mailerklasse zu ändern, und halten uns dennoch an LoggerInterface
. Klogger akzeptiert nicht den zweiten Parameter für Debug-Level-Nachrichten, daher entspricht es PSR-3 auch bei einem Adapter nicht vollständig. Klogger zu erweitern, um es vollständig mit PSR-3 kompatibel zu machen, wäre eine triviale Aufgabe, aber das liegt außerhalb des Rahmens dieses Artikels. Man kann jedoch mit Sicherheit sagen, dass die Verwendung unserer Adapterklasse uns sehr nahe daran ist, vollständig PSR-3-konform zu sein und es uns ermöglicht, LoggerInterface
mit der Klogger-Klasse zu verwenden.
Schlussfolgerung
In diesem Artikel haben wir gelernt, wie man PSR-3 verwendet, um uns zu helfen, loggerfreien Code zu schreiben, der nicht von einer bestimmten Protokollierungsimplementierung abhängt. Viele wichtige PHP-Projekte haben die Unterstützung für PSR-3, darunter Monolog, Symfony und Schnurrbart, sowie andere bekannte Projekte wie Drupal unterstützt, wie man sie am besten integriert. Da PSR-3 die Hindernisse für die Wiederverwendung von Code verringert, sollten wir mehr Bibliotheken und Frameworks korrekt anhand der Protokollierung sehen, um nützliche Informationen für Entwickler bereitzustellen. Wirkt sich PSR-3 aus, wie Sie die Protokollierung in Ihrer Anwendung verwenden? Bitte teilen Sie uns im Kommentarbereich unten mit.
(Bild aus Fotolien)
(Der FAQ-Teil der PSR-3-Protokollierung wird hier aufgrund von Platzbeschränkungen weggelassen. Es kann bei Bedarf hinzugefügt werden.)
Das obige ist der detaillierte Inhalt vonPHP Master | Anmelden mit PSR-3, um die Wiederverwendbarkeit zu verbessern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!