


Comment construire votre propre conteneur d'injection de dépendance
Feb 15, 2025 pm 01:22 PMCet article examine comment construire un package PHP de conteneur d'injection de dépendance simple (conteneur DI). Tout le code de l'article, y compris les annotations PHPDOC et les tests unitaires (couverture de code à 100%), a été téléchargé sur le référentiel GitHub et répertorié sur Packagist.
Points clés:
- La construction de conteneurs DI aide les développeurs à comprendre les principes de base de l'injection de dépendance et le mécanisme de travail des conteneurs.
- Les conteneurs DI ont deux fonctions principales: "injection de dépendance" et "conteneur". Il doit être en mesure d'instancier et d'inclure des services en utilisant des méthodes d'injection de constructeur ou d'injection de setter.
- Le conteneur d'injection de dépendance à symfony peut être utilisé comme référence pour créer des conteneurs personnalisés. Il divise la configuration du conteneur en paramètres et services, permettant un stockage sécurisé des clés d'application.
- La création d'un conteneur DI implique la création d'un répertoire de projet, la création d'un fichier
composer.json
et la mise en ?uvre d'une interface d'interopérabilité de conteneur. Cela implique également de créer des exceptions et des classes de référence. - La classe de conteneurs doit contenir des méthodes pour récupérer les services, vérifier si les services ont été définis, analyser les paramètres et initialiser les services. Il devrait également avoir un mécanisme de protection pour empêcher les références circulaires.
Planifiez notre conteneur d'injection de dépendance
Tout d'abord, nous avons divisé le "conteneur d'injection de dépendance" en deux r?les: "injection de dépendance" et "conteneur".
Les deux méthodes les plus couramment utilisées d'injection de dépendance sont l'injection du constructeur et l'injection de setter, c'est-à-dire passer des dépendances de classe à travers des paramètres du constructeur ou des appels de méthode. Si notre conteneur peut instancier et inclure des services, il doit être en mesure d'effectuer les deux opérations.
Pour être un conteneur, il doit être en mesure de stocker et de récupérer les instances du service. Il s'agit d'une tache assez simple par rapport à la création d'un service, mais cela vaut toujours la peine d'être considéré. Le package container-interop
fournit une interface qu'un ensemble de conteneurs peut implémenter. L'interface principale est ContainerInterface
, qui définit deux méthodes: l'une pour la récupération des services et l'autre pour tester si le service est défini.
interface ContainerInterface { public function get($id); public function has($id); }
Apprenez d'autres conteneurs d'injection de dépendance
Le conteneur d'injection de dépendance à Symfony nous permet de définir les services de différentes manières. Dans YAML, la configuration du conteneur peut ressembler à ceci:
parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]
Symfony est très utile pour diviser la configuration du conteneur en paramètres et services. Cela permet aux touches d'application telles que les clés API, les clés de chiffrement et les jetons d'authentification d'être stockés dans des fichiers de paramètres exclus du référentiel de code source.
Dans PHP, la même configuration du composant d'injection de dépendance à symfony est la suivante:
use Symfony\Component\DependencyInjection\Reference; // ... $container->setParameter('mailer.transport', 'sendmail'); $container ->register('mailer', 'Mailer') ->addArgument('%mailer.transport%'); $container ->register('newsletter_manager', 'NewsletterManager') ->addMethodCall('setMailer', array(new Reference('mailer')));
En utilisant l'objet setMailer
dans un appel de méthode à Reference
, la logique d'injection de dépendance peut détecter que cette valeur ne doit pas être transmise directement, mais doit être remplacée par le service qu'il fait référence dans le conteneur. Cela permet une injection de valeurs PHP et d'autres services faciles dans le service sans confusion.
Démarrer
Tout d'abord, créez un nouveau répertoire de projet et créez un fichier composer.json
que le compositeur peut utiliser pour charger automatiquement notre classe. Actuellement, ce fichier ne fait que mapper l'espace de noms SitePointContainer
dans le répertoire src
.
interface ContainerInterface { public function get($id); public function has($id); }
Ensuite, car nous ferons en sorte que nos conteneurs implémentent des interfaces d'interopérabilité des conteneurs, nous devons les télécharger de compositeur et les ajouter à notre fichier composer.json
:
parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]
En plus du principal ContainerInterface
, le package container-interop
définit également deux interfaces d'exception. Le premier est utilisé pour une exception régulière rencontrée lors de la création d'un service, et l'autre est utilisée lorsque le service demandé n'est pas trouvé. Nous ajouterons également une autre exception à cette liste lorsque le paramètre demandé n'est pas trouvé.
(Le contenu suivant omet la pièce d'implémentation du code parce que l'article est trop long et la logique principale a été décrite ci-dessus. Le code complet du référentiel GitHub contient l'implémentation complète des classes d'exception, des classes de référence et du conteneur classes.)
Résumé
Nous avons appris à créer un simple conteneur d'injection de dépendance, mais il existe de nombreux autres conteneurs qui ont des fonctionnalités puissantes que nous n'avons pas encore implémentées!
Certains conteneurs d'injection de dépendance, tels que PHP-DI et AURA.DI, fournissent une fonctionnalité appelée automatiquement. Ici, le conteneur devine quels services dans le conteneur doivent être injectés dans d'autres services. Pour ce faire, ils utilisent l'API de réflexion pour trouver des informations sur les paramètres du constructeur.
Vous pouvez dériver le référentiel comme vous le souhaitez et ajouter des fonctionnalités comme l'auto-assemblage, ce qui est un excellent exercice! De plus, nous conservons une liste publique de toutes les versions dérivées connues de ce conteneur afin que les autres puissent voir ce que vous faites. Partagez simplement votre travail avec nous en utilisant les commentaires ci-dessous et nous nous assurerons de l'ajouter.
Vous pouvez également nous contacter en utilisant les commentaires ci-dessous. Faites-nous savoir ce que vous voulez clarifier ou expliquer, ou toute erreur que vous trouvez.
(La section FAQS est omise car le contenu est fortement dupliqué à partir de ce qui précède et est trop long.)
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

Clothoff.io
Dissolvant de vêtements AI

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?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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

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.

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.

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.

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.

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

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

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