Maison >développement back-end >tutoriel php >Comment utiliser les conteneurs d'inversion de contrôle (IoC) avec le framework Nette ?

Comment utiliser les conteneurs d'inversion de contrôle (IoC) avec le framework Nette ?

王林
王林original
2023-06-03 22:21:01772parcourir

Nette est un framework d'application web open source basé sur le langage PHP. L'une de ses fonctionnalités principales est le conteneur Inversion of Control (IoC), qui nous permet de gérer des objets et de découpler les composants de notre application via l'injection de dépendances.

Dans cet article, nous allons approfondir le conteneur IoC de Nette Framework et apprendre à l'utiliser dans vos applications pour améliorer la qualité et la maintenabilité du code.

Première étape : Configurer le conteneur IoC

Dans le framework Nette, le fichier de configuration du conteneur IoC se trouve par défaut dans app/config/config.neon. Nous devons définir nos services dans ce fichier puis les référencer ailleurs dans l'application.

Voici un exemple simple qui définit un service appelé logger :

services:

logger:
    class: AppLogger

Ici, nous définissons un service avec le nom de classe AppLogger. Il n'est pas nécessaire de l'instancier ici car le conteneur IoC l'instanciera automatiquement en cas de besoin. Il nous suffit de le définir dans le conteneur de services et nous pouvons l'utiliser.

Étape 2 : Accéder au service

Il existe deux manières d'accéder aux services dans le conteneur IoC. La première façon est d'injecter le service dans le constructeur du contrôleur, comme ceci :

use NetteApplicationUIController; #

private $logger;

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

public function renderDefault()
{
    $this->logger->log('Hello, world!');
}

}


Ici, nous injectons le service logger via le constructeur du contrôleur. Nous pouvons l'utiliser comme un objet normal.

La deuxième façon consiste à utiliser la fonction d'injection automatique du framework Nette. Il nous suffit de marquer le service comme paramètre du constructeur pour l'injection automatique, et le conteneur d'injection de dépendances l'injectera automatiquement. Ceci peut être réalisé avec :

use NetteApplicationUIController;

class SampleController extends Controller

{

/** @var AppLogger @inject */
public $logger;

public function renderDefault()
{
    $this->logger->log('Hello, world!');
}

}

# 🎜 🎜#Ici, nous avons marqué l'attribut $logger de type AppLogger et utilisé la balise @Inject pour indiquer au framework Nette de l'injecter.

Étape 3 : Utiliser des balises

Parfois, nous devons injecter d'autres services dans le constructeur du service. Pour résoudre ce problème, le framework Nette propose la notion de balises. Une balise est une chaîne qui représente un service (ou un ensemble de services). Lorsque le conteneur IoC instancie un objet, il vérifie les paramètres du constructeur de l'objet et, si les paramètres sont marqués, injecte le service représenté par la marque.

Voici un exemple qui définit deux services (logger et base de données) et utilise des balises pour les injecter dans l'objet Calculatrice :

services:#🎜🎜 #
logger:
    class: AppLogger

database:
    class: AppDatabase

calculator:
    class: AppCalculator
    arguments:
        - @logger
        - @database
#🎜🎜 #Ici, nous définissons trois services : enregistreur, base de données et calculateur. L'enregistreur et la base de données sont déclarés comme des services normaux, et la calculatrice utilise des balises dans les arguments pour référencer les services de l'enregistreur et de la base de données. Notez que la balise commence par le symbole @.

Maintenant, lorsque nous instancions un objet Calculatrice, le conteneur IoC injectera automatiquement les services de journalisation et de base de données et les transmettra au constructeur de l'objet Calculatrice.

Summary

Dans cet article, nous avons approfondi le conteneur IoC du framework Nette et appris à l'utiliser dans nos applications. Maîtriser les connaissances de base des conteneurs IoC peut nous aider à écrire un meilleur code PHP et à améliorer la qualité et la maintenabilité du code. J'espère que cet article vous aidera !

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:
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