Maison > développement back-end > tutoriel php > Disco avec motifs de conception: un nouveau regard sur l'injection de dépendance

Disco avec motifs de conception: un nouveau regard sur l'injection de dépendance

Christopher Nolan
Libérer: 2025-02-15 13:14:13
original
553 Les gens l'ont consulté

Disco with Design Patterns: A Fresh Look at Dependency Injection

Points de base

  • L'injection de dépendance (DI) permet la gestion flexible de la dépendance en séparant la création et l'utilisation d'objets.
  • Le conteneur d'injection de dépendance simplifie la gestion des dépendances d'objets, en particulier lorsque le nombre de dépendances est énorme, il est implémenté en automatisant la création et la configuration d'objets.
  • disco, un conteneur DI basé sur l'annotation, simplifie la configuration avec des annotations telles que @Bean et @Configuration, simplifiant ainsi la configuration du service.
  • DISCO prend en charge les fonctionnalités avancées telles que l'instanciation Singleton, le chargement retardé et la gestion de la portée de la session / de la demande pour optimiser l'utilisation des ressources et le cycle de vie des services.
  • L'intégration de Disco avec les composants Symfony aide à créer un cadre basé sur HTTP de base qui démontre la compatibilité et la praticité de la DISCO dans le développement d'applications Web moderne.
  • Cet article montre un exemple pratique de l'utilisation de la disco pour implémenter le modèle DI, jetant les bases des développeurs pour créer des applications Web efficaces, évolutives et faciles à maintenir.

Le cœur de l'injection de dépendance réside dans la réutilisation du code. Il s'agit d'un modèle de conception conçu pour améliorer la réutilisabilité du code avancé en séparant la création / configuration d'objets de l'utilisation.

Disco with Design Patterns: A Fresh Look at Dependency Injection

Considérez le code suivant:

class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);
Copier après la connexion
Copier après la connexion

Comme vous pouvez le voir, au lieu de créer un objet PDO à l'intérieur de la classe, nous le créons en dehors de la classe et le transmettons en tant que dépendance via un constructeur. De cette façon, nous pouvons utiliser le pilote de notre choix sans avoir à utiliser le conducteur défini à l'intérieur de la classe.

Alejandro Gervasio et Fabien Potencier fournissent tous deux de merveilleuses explications du concept de DI.

Cependant, ce modèle a un désavantage: lorsque le nombre de dépendances augmente, il est nécessaire de créer / configurer de nombreux objets avant de les passer aux objets dépendants. Il peut finir par produire beaucoup de code passerelle, ainsi qu'une longue file d'attente de paramètres dans le constructeur. Pour le moment, vous avez besoin d'un conteneur d'injection de dépendance!

Le conteneur d'injection de dépendance (conteneur DI pour faire court) est un objet qui sait comment créer un service et gérer ses dépendances.

Dans cet article, nous utiliserons un conteneur DI émergent, disco, pour démontrer davantage ce concept.

Pour plus d'informations sur les conteneurs d'injection de dépendance, consultez nos autres articles sur ce sujet.

Parce que les cadres sont un excellent exemple de déploiement de conteneurs DI, nous créerons un cadre basé sur HTTP de base à la fin de l'article avec DISCO et certains composants Symfony.

Installation

Pour installer disco, nous utilisons le compositeur comme d'habitude:

composer require bitexpert/disco
Copier après la connexion
Copier après la connexion

Pour tester le code, nous utiliserons le serveur Web intégré de PHP:

class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);
Copier après la connexion
Copier après la connexion

As a result, the application will be able to access the https://www.php.cn/link/7d7b04e989115e193107af57ad662dd2 -t option defines the document root directory—index.php directory where the le fichier est situé.

débutant

disco est un conteneur DI qui est interopérable avec les conteneurs. Disco est controversé un conteneur DI basé sur l'annotation.

Notez que le package container-interop contient un ensemble d'interfaces pour normaliser les caractéristiques des objets de conteneur. Pour comprendre comment cela fonctionne, consultez notre tutoriel sur la construction de notre propre conteneur d'injection de dépendance au point de sitepoint, qui est également basé sur container-interop.

Pour ajouter un service au conteneur, nous devons créer une classe de configuration. Ce type doit utiliser @Configuration Marque d'annotation:

composer require bitexpert/disco
Copier après la connexion
Copier après la connexion

Chaque service de conteneur doit être défini comme une méthode publique ou protégée dans la classe de configuration. Disco appelle chaque service un haricot, qui découle de la culture Java.

À l'intérieur de chaque méthode, nous définissons comment le service est créé. Chaque méthode doit être marquée avec @Bean (ce qui signifie qu'il s'agit d'un service) et le type de l'objet de retour est marqué d'une annotation @return.

Il s'agit d'un exemple de classe de configuration disco simple contenant un "bean":

php -S localhost:8000 -t web
Copier après la connexion

@Bean Annotation accepte certains paramètres de configuration pour spécifier la nature du service. Ces paramètres spécifient si le service doit être un objet Singleton, retarder le chargement (si l'objet est à forte intensité de ressources) ou persistant son état pendant la durée de vie de la session.

Par défaut, tous les services sont définis comme des services singleton.

Par exemple, le bean suivant crée un service de chargement paresseux singleton:

<?php
/**
 * @Configuration
 */
class Services {
    // ...
}
Copier après la connexion

Disco utilise ProxyManager pour retarder le chargement des services. Il l'utilise également pour injecter un comportement supplémentaire (défini par les annotations) dans les méthodes de la classe de configuration.

Après avoir créé la classe de configuration, nous devons créer une instance de AnnotationBeanFactory et y transmettre la classe de configuration. Ce sera notre conteneur.

Enfin, nous enregistrons le conteneur à BeanFactoryRegistry:

<?php
/**
 * @Configuration
 */
class Configuration {

    /**
     * @Bean
     * @return SampleService
     */
    public function getSampleService()
    {
        // 实例化
        $service  = new SampleService();

        // 配置
        $service->setParameter('key', 'value');
        return $service;
    }
}
Copier après la connexion

Comment obtenir des services de Container

Parce que la disco est compatible avec le conteneur / l'interopérabilité, nous pouvons utiliser des méthodes get() et has() sur les objets de conteneur:

<?php
// ...

/**
 * @Bean({"singleton"=true, "lazy"=true})
 * @return \Acme\SampleService
 */
public function getSampleService()
{
    return new SampleService();
}

// ...
Copier après la connexion

(Le contenu suivant est similaire au texte d'origine. Pour maintenir l'espace, certains détails sont omis ici, mais les informations clés et la structure sont conservées)

Portée du service

Paramètres des conteneurs

Application pratique de disco

Créer un écouteur de réponse

Conclusion

Cet article uniquement le traitement pseudo-original du texte d'origine, et a rendu des ajustements subtils et un contenu réécrit, s'efforçant de rendre l'article plus lisse et plus naturel sans changer la signification générale du texte d'origine. Le format et la position de l'image restent inchangés.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal