国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison développement back-end tutoriel php PHP Master | Enregistrement avec PSR-3 pour améliorer la réutilisabilité

PHP Master | Enregistrement avec PSR-3 pour améliorer la réutilisabilité

Feb 24, 2025 am 10:42 AM

PHP Master | Logging with PSR-3 to Improve Reusability

Points de base

  • PSR-3, une interface d'objet logarithmique commune, permet aux développeurs d'écrire du code réutilisable sans s'appuyer sur une implémentation de journal spécifique, améliorant ainsi la compatibilité entre les différentes bibliothèques de journaux dans PHP.
  • L'interface
  • PSR-3 fournit huit méthodes pour gérer les messages de différents niveaux de gravité et une méthode log() courante qui peut recevoir tous les niveaux de gravité. Sa conception est de résoudre le problème de l'incompatibilité de l'implémentation des logarithmes.
  • Bien que le PSR-3 présente de nombreux avantages, certaines bibliothèques de journaux ne le soutiennent pas en nativement. Cependant, les développeurs peuvent créer des adaptateurs conformes PSR-3 en tirant parti du mode adaptateur et en étendant la classe AbstractLogger fournie dans la bibliothèque PSR / log.
  • De nombreux projets PHP majeurs, notamment Monolog, Symfony et Mustache.php, ont ajouté le support pour PSR-3. Comme il réduit les barrières à la réutilisation du code, davantage de bibliothèques et de cadres devraient utiliser correctement la journalisation, fournissant des informations utiles aux développeurs.

Dans le développement de PHP, la journalisation est l'une des taches les plus courantes. Nous utilisons des journaux pour suivre les messages d'erreur, enregistrer des événements importants et déboguer les problèmes de code. Dans n'importe quel projet PHP, le code peut être rempli d'appels aux bibliothèques de journaux qui gèrent ces opérations pour nous. Malheureusement, les appels aux bibliothèques de journaux sont dispersés dans tout le code, ce qui rend le code dépend de la disponibilité de la bibliothèque, ce qui est clairement contraire au principe de l'inversion de dépendance. Même si nous utilisons l'injection de dépendance pour permettre à nos objets d'accéder à la bibliothèque de journaux, la différence entre les bibliothèques de journaux signifie que les commutations entre eux peuvent être difficiles et longs, nécessitant une refactorisation majeure de la bibliothèque de code entière. Pour améliorer la compatibilité entre les bibliothèques de journaux, l'équipe PHP-Fig a récemment publié PSR-3, une interface d'objet logarithmique commune. Dans cet article, je vais discuter de la fa?on dont l'interface de journal définie par PSR-3 nous permet d'écrire du code réutilisable qui ne dépend d'une implémentation de journal particulière.

PSR-3 Démarrage rapide

Avant de comprendre comment PSR-3 rend notre code plus réutilisable, il est nécessaire de comprendre ce qu'est le PSR-3. Si vous connaissez déjà PSR-3, vous pouvez ignorer cette section. Le noyau de la spécification est l'interface pour log les objets. Cette interface révèle huit fa?ons de gérer les messages de différents niveaux de gravité et une méthode courante log() qui peut accepter les niveaux de gravité. Les huit niveaux de gravité soutenus par PSR-3 sont basés sur RFC 5424, comme décrit ci-dessous:

  • emergency - Le système ne peut pas être utilisé
  • alert - L'action est requise
  • critical - situation grave
  • error - Erreurs qui n'ont pas besoin d'attention immédiate mais doivent être surveillées
  • warning - un événement inhabituel ou indésirable, mais pas une erreur
  • notice - événements normaux mais importants
  • info - événements intéressants
  • debug - Détails pour le débogage

Chaque méthode de journal accepte un message qui doit être une cha?ne ou un objet avec une méthode __toString(). Les paramètres supplémentaires acceptent un tableau qui peut fournir des informations de contexte pour les messages de journal. Une description complète de ces méthodes et paramètres peut être trouvée dans la spécification PSR-3.

Obtenez un fichier psr-3

Obtenir les fichiers dont vous avez besoin pour utiliser PSR-3 est facile - vous pouvez les trouver dans le référentiel PSR / Log GitHub. Vous pouvez également utiliser Composer pour obtenir ces fichiers de Packagist. Voici un exemple de fichier A composer.json pour récupérer les fichiers PSR / journaux:

{
    "require": {
        "psr/log": "dev-master"
    }
}

Comment limiter la réutilisation du code de la journalisation

PHP a de nombreuses bibliothèques de journaux différentes, chacune avec sa propre fa?on de collecter et d'enregistrer des données. Bien qu'ils aient des points communs, chaque bibliothèque a son propre ensemble unique de méthodes de journalisation. Cela signifie que la commutation entre les journaux peut être difficile et nécessite souvent de modifier le code où vous utilisez la journalisation. Cela fonctionne à contraire au principe solide de la réutilisation du code et de la conception orientée objet. La situation à laquelle nous sommes confrontés est que déclarer les dépendances sur des bibliothèques de journaux spécifiques ou éviter complètement la journalisation. Pour illustrer ce problème plus clairement, un exemple spécifique est nécessaire. Supposons que nous créons un simple objet Mailer pour gérer l'envoi d'e-mails. Nous voulons que Mailer enregistre un message chaque fois que nous envoyons un e-mail, et nous avons décidé d'utiliser l'excellente bibliothèque Monologue pour répondre à nos besoins de journalisation.

<?php namespace Email;

class Mailer
{
    private $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        $this->logger->addInfo("Email sent to $emailAddress");
    }
}

Nous pouvons utiliser cette classe avec le code suivant:

<?php
// 創(chuàng)建一個(gè)Monolog對(duì)象
$logger = new Monolog\Logger("Mail");
$logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log"));

// 創(chuàng)建郵件發(fā)送器并發(fā)送電子郵件
$mailer = new Email\Mailer($logger);
$mailer->sendEmail("email@example.com");

L'exécution de ce code créera une nouvelle entrée dans le fichier mail.log, enregistrant l'e-mail envoyé. à ce stade, nous pourrions penser que nous avons écrit un objet Mailer réutilisable. Nous utilisons l'injection de dépendance pour rendre l'enregistreur disponible pour Mailer, afin que nous puissions échanger différentes configurations d'enregistrement sans toucher à notre code Mailer. Il semble que nous ayons réussi le principe solide et évité de créer des dépendances dures. Mais supposons que nous voulons réutiliser la classe Mailer dans différents projets en utilisant Analog pour gérer les interactions de journalisation. Maintenant, nous avons un problème car Analog n'a pas de méthode addInfo(). Pour enregistrer les messages au niveau de l'information à l'aide de Analog, nous appelons Analog::log($message, Analog::INFO). Nous pouvons modifier la classe Mailer pour utiliser la méthode analogique comme indiqué ci-dessous.

<?php namespace Email;

class Mailer
{
    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        Analog::log("Email sent to $emailAddress", Analog::INFO);
    }
}

Nous pouvons utiliser la classe Mailer mise à jour avec le code suivant:

{
    "require": {
        "psr/log": "dev-master"
    }
}

Bien que cela fonctionnera, il est loin d'être idéal. Nous avons rencontré la dépendance de Mailer à l'égard d'une implémentation de journalisation spécifique, ce qui nécessite de modifier la classe lors de l'introduction d'un nouvel enregistreur. Cela rend la classe moins réutilisable et nous oblige à choisir entre s'appuyer sur la disponibilité d'un enregistreur particulier ou l'abandon de la journalisation dans la classe.

Utilisez PSR-3 pour éviter les dépendances en journaliste

Comme l'explique Alejandro Gervasio dans son excellent article sur le sujet, le principe de l'inversion de dépendance nous dit que nous devons compter sur l'abstraction plut?t que sur des implémentations concrètes. Dans le cas de l'exploitation forestière, notre problème actuel a été l'absence d'une abstraction appropriée sur laquelle on peut s'appuyer. C'est là que le PSR-3 entre en jeu. Le PSR-3 est con?u pour surmonter l'incompatibilité de la mise en ?uvre de la journalisation en fournissant une interface commune pour l'enregistreur (correctement nommé LoggerInterface). En fournissant une interface qui n'est pas liée à une implémentation spécifique, PSR-3 nous permet d'éviter de compter sur un enregistreur spécifique - nous pouvons plut?t taper une invite LoggerInterface pour obtenir un enregistreur conforme à PSR-3. J'ai mis à jour la classe Mailer suivante pour le démontrer:

<?php namespace Email;

class Mailer
{
    private $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        $this->logger->addInfo("Email sent to $emailAddress");
    }
}
Le constructeur

a été modifié pour accepter l'implémenteur LoggerInterface, et la méthode sendEmail() appelle désormais la méthode info() spécifiée dans PSR-3. Monolog est déjà conforme PSR-3, et Analog fournit un objet wrapper qui implémente LoggerInterface, nous pouvons donc maintenant utiliser ces deux b?cherons sans modifier la classe Mailer. Voici comment appeler ce cours à l'aide de Monolog:

<?php
// 創(chuàng)建一個(gè)Monolog對(duì)象
$logger = new Monolog\Logger("Mail");
$logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log"));

// 創(chuàng)建郵件發(fā)送器并發(fā)送電子郵件
$mailer = new Email\Mailer($logger);
$mailer->sendEmail("email@example.com");

et utilisez un analogique:

<?php namespace Email;

class Mailer
{
    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        Analog::log("Email sent to $emailAddress", Analog::INFO);
    }
}

Maintenant, nous pouvons utiliser notre objet Mailer avec une bibliothèque sans modifier la classe Mailer ou modifier la fa?on dont nous l'utilisons.

Utilisez le mode adaptateur pour les journalistes qui ne prennent pas en charge PSR-3

Jusqu'à présent, nous avons réussi à découpler l'objet Mailer à partir de toute implémentation de journalisation spécifique via l'implémentateur demandant LoggerInterface. Mais qu'en est-il des journalistes qui n'ont pas encore été ajoutés pour le support PSR-3? Par exemple, la populaire bibliothèque Klogger n'a pas été mise à jour depuis un certain temps et est actuellement incompatible avec PSR-3. Heureusement, nous pouvons facilement cartographier les méthodes exposées par Klogger à celles définies dans LoggerInterface en tirant parti du motif de l'adaptateur. Les fichiers pris en charge dans le référentiel PSR / Log nous permettent de créer facilement des classes d'adaptateur en fournissant une classe AbstractLogger que nous pouvons étendre. Une classe abstraite transmet simplement huit méthodes de journal spécifiques au niveau défini dans LoggerInterface à une méthode commun log(). En étendant la classe AbstractLogger et en définissant notre propre méthode log(), nous pouvons facilement créer des adaptateurs conformes PSR-3 aux journalistes qui ne prennent pas nativement le PSR-3. Je vais le démontrer ci-dessous en créant un adaptateur simple pour Klogger:

{
    "require": {
        "psr/log": "dev-master"
    }
}
La méthode

log() mappe simplement la méthode LoggerInterface à la méthode Klogger respective, et le klogger gère l'activité de journalisation réelle. En emballant la classe Klogger de cette fa?on, nous pouvons l'utiliser sans casser le contrat LoggerInterface. Nous pouvons maintenant utiliser l'adaptateur Klogger avec la classe Mailer:

<?php namespace Email;

class Mailer
{
    private $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        $this->logger->addInfo("Email sent to $emailAddress");
    }
}

Avec la classe d'adaptateur, nous pouvons utiliser Klogger sans modifier la classe Mailer et adhérer toujours à LoggerInterface. Klogger n'accepte pas le deuxième paramètre des messages de niveau de débogage, il ne se conforme donc pas pleinement au PSR-3 même avec un adaptateur. L'extension de Klogger pour le rendre entièrement compatible avec le PSR-3 serait une tache triviale, mais cela dépasse le cadre de cet article. Cependant, il est s?r de dire que l'utilisation de notre classe d'adaptateur nous rend très près d'être entièrement conformes au PSR-3 et nous permet d'utiliser LoggerInterface avec la classe Klogger.

Conclusion

Dans cet article, nous avons appris à utiliser PSR-3 pour nous aider à rédiger du code sans enregistrement qui ne dépend pas d'une implémentation de journalisation spécifique. De nombreux projets PHP majeurs ont ajouté un soutien pour PSR-3, notamment Monolog, Symfony et Mustache.php, ainsi que d'autres projets bien connus comme Drupal discutent de la meilleure fa?on de l'intégrer. étant donné que le PSR-3 réduit les obstacles à la réutilisation du code, nous devrions voir davantage de bibliothèques et de frameworks utiliser correctement la journalisation pour fournir des informations utiles aux développeurs. PSR-3 affectera-t-il la fa?on dont vous utilisez la journalisation dans votre application? Veuillez nous faire savoir dans la section des commentaires ci-dessous.

(image de Fotolia)

(La partie FAQ de la journalisation PSR-3 est omise ici en raison des limitations de l'espace. Il peut être ajouté au besoin.)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en ?uvre l'authentification et l'autorisation dans PHP? Comment mettre en ?uvre l'authentification et l'autorisation dans PHP? Jun 20, 2025 am 01:03 AM

ToseCurelyHandleAuthentication andAuthorizationInPhp, suivitheSesteps: 1.AlwayShashPasswordSwithPassword_Hash () etverifyusingPassword_verify (), usePreparedStatementStopReventsQLendiject, andstoreSerDatain $ _SessionAfterLogin.2

Comment pouvez-vous gérer les téléchargements de fichiers en toute sécurité dans PHP? Comment pouvez-vous gérer les téléchargements de fichiers en toute sécurité dans PHP? Jun 19, 2025 am 01:05 AM

Pour gérer en toute sécurité les téléchargements de fichiers dans PHP, le noyau consiste à vérifier les types de fichiers, à renommer les fichiers et à restreindre les autorisations. 1. Utilisez finfo_file () pour vérifier le type de mime réel, et seuls des types spécifiques tels que l'image / jpeg sont autorisés; 2. Utilisez Uniqid () pour générer des noms de fichiers aléatoires et les stocker dans le répertoire racine non Web; 3. Limiter la taille du fichier via les formulaires PHP.ini et HTML et définir les autorisations de répertoire sur 0755; 4. Utilisez Clamav pour scanner les logiciels malveillants pour améliorer la sécurité. Ces étapes empêchent efficacement les vulnérabilités de sécurité et garantissent que le processus de téléchargement de fichiers est s?r et fiable.

Quelles sont les différences entre == (comparaison lache) et === (comparaison stricte) en PHP? Quelles sont les différences entre == (comparaison lache) et === (comparaison stricte) en PHP? Jun 19, 2025 am 01:07 AM

En PHP, la principale différence entre == et == est la rigueur de la vérification des types. == La conversion de type sera effectuée avant la comparaison, par exemple, 5 == "5" Renvoie True, et === Demande que la valeur et le type soient les mêmes avant que True sera renvoyé, par exemple, 5 === "5" Renvoie False. Dans les scénarios d'utilisation, === est plus sécurisé et doit être utilisé en premier, et == n'est utilisé que lorsque la conversion de type est requise.

Comment pouvez-vous interagir avec les bases de données NoSQL (par exemple, MongoDB, redis) de PHP? Comment pouvez-vous interagir avec les bases de données NoSQL (par exemple, MongoDB, redis) de PHP? Jun 19, 2025 am 01:07 AM

Oui, PHP peut interagir avec les bases de données NoSQL comme MongoDB et Redis à travers des extensions ou des bibliothèques spécifiques. Tout d'abord, utilisez le pilote MongoDBPHP (installé via PECL ou Composer) pour créer des instances clients et faire fonctionner des bases de données et des collections, en prenant en charge l'insertion, la requête, l'agrégation et d'autres opérations; Deuxièmement, utilisez la bibliothèque Predis ou l'extension PHPREDIS pour vous connecter à Redis, effectuer des paramètres et des acquisitions de valeur clé, et recommander PHPredis pour des scénarios à haute performance, tandis que Predis est pratique pour un déploiement rapide; Les deux conviennent aux environnements de production et sont bien documentés.

Comment effectuer des opérations arithmétiques en php (, -, *, /,%)? Comment effectuer des opérations arithmétiques en php (, -, *, /,%)? Jun 19, 2025 pm 05:13 PM

Les méthodes d'utilisation des opérations mathématiques de base en PHP sont les suivantes: 1. Les signes d'addition prennent en charge les entiers et les nombres à virgule flottante, et peuvent également être utilisés pour les variables. Les numéros de cha?ne seront automatiquement convertis mais non recommandés en dépendances; 2. Les signes de soustraction utilisent - les signes, les variables sont les mêmes et la conversion de type est également applicable; 3. Les panneaux de multiplication utilisent * les panneaux, qui conviennent aux nombres et aux cha?nes similaires; 4. La division utilise / signes, qui doit éviter de diviser par zéro, et noter que le résultat peut être des nombres à virgule flottante; 5. Prendre les signes du module peut être utilisé pour juger des nombres impairs et uniformes, et lors du traitement des nombres négatifs, les signes restants sont cohérents avec le dividende. La clé pour utiliser correctement ces opérateurs est de s'assurer que les types de données sont clairs et que la situation limite est bien gérée.

Comment rester à jour avec les derniers développements PHP et meilleures pratiques? Comment rester à jour avec les derniers développements PHP et meilleures pratiques? Jun 23, 2025 am 12:56 AM

TostayCurrentwithPhpDevelopments andBestPractices, suiventyewnewsources likephp.netandphpweekly, engagewithcommunitiesonforumums et conférences, keeptoolingupdated etgradualadoptnewfeatures, etreadorontruttetoopensourceprojects.

Qu'est-ce que PHP et pourquoi est-il utilisé pour le développement Web? Qu'est-ce que PHP et pourquoi est-il utilisé pour le développement Web? Jun 23, 2025 am 12:55 AM

PhpBecamepopularforwebDevelopmentDuetoitSeaseOflearning, Samoussentegration withhtml, widespreadhostingsupport, andalargecosystemysteclustingframeworkslikeLaravelandcmsplateformeslikewordpress.itexcelSinlingFormSubMissions, ManagetingSeSeSessions, interactif, interactif

Comment définir le fuseau horaire PHP? Comment définir le fuseau horaire PHP? Jun 25, 2025 am 01:00 AM

Tosetherighttimezoneinphp, usedate_default_timezone_set () Fonctionnellestartofyourscriptwithavalididentifiersuchas'america / new_york'.1.usedate_default_timezone_set () beforeanydate / timefunctions.20

See all articles