Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich die Abhängigkeitsinjektion im Kajona-Framework?

Wie verwende ich die Abhängigkeitsinjektion im Kajona-Framework?

WBOY
WBOYOriginal
2023-06-03 14:01:351300Durchsuche

Kajona ist ein leichtes PHP-Open-Source-Framework, das auf Benutzerfreundlichkeit und Skalierbarkeit setzt und viele praktische Tools und Komponenten bereitstellt, die es Entwicklern ermöglichen, schnell komplexe Webanwendungen zu erstellen. Eine der sehr wichtigen Funktionen ist die Abhängigkeitsinjektion (Dependency Injection), die es uns ermöglicht, Abhängigkeiten zwischen Klassen flexibler zu verwalten und die Testbarkeit und Wartbarkeit des Codes zu fördern.

Dieser Artikel gibt eine detaillierte Einführung in die Abhängigkeitsinjektion im Kajona-Framework, einschließlich der Definition eines Dienstes (Service), der Injektion von Abhängigkeiten (Dependency), der Verwendung eines Containers (Container) usw.

1. Dienste definieren

Im Kajona-Framework bezieht sich ein Dienst auf eine wiederverwendbare Klasse oder ein wiederverwendbares Objekt, auf das sich normalerweise mehrere Komponenten verlassen. Beim Definieren eines Dienstes müssen Sie den Klassennamen des Dienstes und die Werte der Konstruktorparameter angeben. Beispielsweise können wir einen Dienst namens „UserService“ definieren, der zur Verwaltung von Benutzerinformationen verwendet wird und ein Datenbankverbindungsobjekt namens „db“ als Konstruktorparameter erfordert.

Es gibt zwei Möglichkeiten, Dienste zu definieren: Eine besteht darin, sie in der Konfigurationsdatei zu definieren, und die andere darin, sie im Code zu definieren. Sie werden im Folgenden gesondert vorgestellt.

1. In der Konfigurationsdatei definieren

Im Kajona-Framework werden normalerweise XML-Dateien zur Konfiguration verwendet. Sie können der Konfigurationsdatei den folgenden Code hinzufügen, um einen Dienst zu definieren:

<service id="UserService" class="ppservicesUserService">
   <argument type="service" id="Database"/>
</service>

Darunter ist das ID-Attribut der Name des Dienstes, das Klassenattribut der Klassenname, der dem Dienst entspricht, und das Argument-Tag wird zur Definition verwendet Die Konstruktorparameter und das Typattribut können „Dienst“ (verweisen auf andere Dienste) oder „Wert“ (direkte Übergabe von Parameterwerten) sein. Das ID-Attribut ist der Name oder Parameterwert des referenzierten Dienstes.

Im obigen Beispiel haben wir einen Dienst namens „UserService“ definiert und die entsprechende Klasse ist „ppservicesUserService“. Der Konstruktor benötigt einen Dienst namens „Database“ als Parameter, der ein Datenbankverbindungsobjekt darstellt.

2. Im Code definieren

Zusätzlich zur Definition von Diensten in Konfigurationsdateien können sie auch über Code definiert werden. Beispielsweise können wir den Dienst „UserService“ in der Datei „app.php“ definieren:

$app->register('UserService', function($app){
   $db = $app->make('Database');
   return new ppservicesUserService($db);
});

Im obigen Code rufen wir zunächst die Funktion $app->register() auf, um den Dienst zu registrieren. Der erste Parameter dieser Funktion ist der Dienstname und der zweite Parameter ist eine anonyme Funktion, die zum Generieren einer Dienstinstanz verwendet wird. Diese Funktion empfängt das $app-Objekt als Parameter und kann die Methode $app->make() aufrufen, um andere Dienste zu erhalten. Schließlich geben wir ein neues UserService-Objekt zurück und übergeben $db als Konstruktorparameter.

2. Abhängigkeiten einfügen

Im Kajona-Framework gibt es normalerweise zwei Möglichkeiten, Abhängigkeiten einzufügen: Konstruktorinjektion und Attributinjektion, die im Folgenden vorgestellt werden.

1. Konstruktorinjektion

Konstruktorinjektion bedeutet, dass abhängige Objekte beim Erstellen eines Objekts durch den Konstruktor geleitet werden. Beispielsweise können wir den von „UserService“ benötigten „Database“-Dienst über den Konstruktor injizieren:

class UserService {
   private $db;
   public function __construct(Database $db){
      $this->db = $db;
   }
}

Im obigen Code haben wir im Konstruktor von UserService ein Datenbankobjekt erhalten und es der privaten Variablen $db zugewiesen. Auf diese Weise wird das $db-Objekt zu einer Mitgliedsvariablen von UserService und kann in anderen Methoden dieser Klasse verwendet werden.

Beim Erstellen eines UserService-Objekts müssen wir ein Datenbankobjekt bereitstellen, wie unten gezeigt:

$userService = $app->make('UserService');

Das Kajona-Framework analysiert automatisch den Konstruktor der UserService-Klasse und erstellt ein neues Objekt über den „Database“-Dienst. Daher müssen wir Datenbankobjekte nicht manuell erstellen und müssen uns auch nicht um die Erstellungsreihenfolge kümmern. Abhängigkeiten werden vom Framework automatisch verwaltet.

2. Eigenschaftsinjektion

Eigenschaftsinjektion bezieht sich auf die Injektion abhängiger Objekte über die Setter-Methode nach der Erstellung des Objekts. Beispielsweise können wir eine setDatabase()-Methode in der UserService-Klasse definieren, um das Datenbankobjekt einzufügen:

class UserService {
   private $db;
   public function setDatabase(Database $db){
      $this->db = $db;
   }
}

Beachten Sie, dass Sie bei Verwendung der Attributinjektion die Set-Methode manuell aufrufen müssen, um das abhängige Objekt zu injizieren. Andernfalls tritt bei Verwendung des UserService-Objekts ein Nullfehler auf.

3. Container verwenden

Im Kajona-Framework ist Container (Container) ein wichtiges Konzept, das zur Verwaltung von Dienstinstanzen und Abhängigkeiten verwendet wird. Der Container löst automatisch Abhängigkeiten zwischen Diensten auf und instanziiert Dienstobjekte nach Bedarf.

Im Kajona-Framework kann über das $app-Objekt auf den Container zugegriffen werden. Beispielsweise können wir die Methode $app->make() verwenden, um eine Dienstinstanz abzurufen:

$userService = $app->make('UserService');
$userService->setDatabase($app->make('Database'));

Diese Methode sucht im Container nach einem Dienst mit dem Namen „UserService“ und gibt ein neues UserService-Objekt zurück.

Zusätzlich zur Methode $app->make() gibt es weitere Methoden, um auf den Container zuzugreifen, wie zum Beispiel:

• $app->has($id), mit dem überprüft wird, ob ein Container vorhanden ist ein angegebener Dienst im Container ;

• $app->get($id), wird verwendet, um die Instanz des angegebenen Dienstes abzurufen

• $app->bind($id, $concrete), wird verwendet, um a zu binden; spezifische Instanz zu den vom Container bezeichneten Diensten.

Zusammenfassung

Abhängigkeitsinjektion ist ein sehr wichtiges Entwurfsmuster. Der Abhängigkeitsinjektionsmechanismus ist im Kajona-Framework implementiert, was die Kopplung zwischen Systemen erheblich reduziert und die Skalierbarkeit und Testbarkeit des Codes verbessert. Dieser Artikel stellt detailliert vor, wie man im Kajona-Framework Dienste definiert, Abhängigkeiten einfügt und Container verwendet, und hofft, Entwicklern dabei zu helfen.

Das obige ist der detaillierte Inhalt vonWie verwende ich die Abhängigkeitsinjektion im Kajona-Framework?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn