Dependency Injection/Einbringen von Abhängigkeiten
Dependency Injection (DI) hört sich kompliziert an und die deutsche Übersetzung Einbringen von Abhängigkeiten ist ebenfalls nicht wirklich positiv. Auf den ersten Blick soll Programmcode so flexibel wie möglich sein. Also nicht angewiesen auf etwas anderes. Abhängig ist niemand gerne. Das Wort hat einen negativen Touch.
Kompliziert und negativ? Bei genauem Hinsehen trifft beides nicht zu. Mithilfe eines praktischen Beispiels, werden die Vorteile klar.
Die Erklärungen in diesem Kapitel sind ein Exkurs. Das bedeutet konkret: Der hier beschriebene Code ist nicht in der Endfassung des Boilerplates enthalten.
Dependency Injection/Einbringen von Abhängigkeiten in Joomla
Schritt 1 - Die Funktion displayDirection() hinzufügen
Die Ausgangssituation: Stelle dir vor, du möchtest zu jedem Item in deiner Komponente die Anfahrt individuell erklärbar gestalten.
Für Ungeduldige: Sieh dir den geänderten Programmcode in der Diff-Ansicht[^codeberg.org/astrid/j4examplecode/compare/t27..t27a1] an.
administrator/components/com_foos/src/Extension/FoosComponent.php
Damit alle Anfahrsmöglichkeiten von einer Stelle aus verwaltbar sind, startest du den Aufruf in der Datei administrator/components/com_foos/src/Extension/FoosComponent.php
ein. Diese Datei nutzt einen Container, beziehungsweise die Schnittstelle ContainerInterface
.
administrator/components/com_foos/src/Extension/FoosComponent.php
use Joomla\CMS\HTML\HTMLRegistryAwareTrait;
use FooNamespace\Component\Foos\Administrator\Service\HTML\AdministratorService;
use FooNamespace\Component\Foos\Administrator\Service\HTML\Icon;
+use FooNamespace\Component\Foos\Administrator\Service\HTML\Direction;
use Psr\Container\ContainerInterface;
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\Component\Router\RouterServiceInterface;
public function boot(ContainerInterface $container)
{
$this->getRegistry()->register('foosadministrator', new AdministratorService);
$this->getRegistry()->register('fooicon', new Icon($container->get(SiteApplication::class)));
+ $this->getRegistry()->register('foodirection', new Direction());
}
/**
administrator/components/com_foos/src/Service/HTML/Direction.php
Die Anfahrtsbeschreibung geben wir über die Methode displayDirection
der Klasse Direction
als Text aus.
administrator/components/com_foos/src/Service/HTML/Direction.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\HTML;
+
+\defined('_JEXEC') or die;
+
+/**
+ * Directions Helper
+ *
+ * @since __DEPLOY_VERSION__
+ */
+class Direction
+{
+ /**
+ * Service constructor
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Method to generate a routing direction
+ *
+ * @return string The HTML markup for the create item link
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function displayDirection()
+ {
+ return "The route description";
+ }
+}
components/com_foos/tmpl/foo/default.php
Für die eigentliche Ausgabe ist das Template default.php
im Verzeichnis components/com_foos/tmpl/foo/
zuständig.
components/com_foos/tmpl/ foo/default.php
</div>
<?php endif; ?>
+<hr>
+<?php echo HTMLHelper::_('foodirection.displayDirection', $this->item, $tparams); ?>
+<hr>
+
<?php
echo $this->item->event->afterDisplayTitle;
echo $this->item->event->beforeDisplayContent;
Wenn du ein Item im Frontend aufrufst, erscheint der Text, den du zur Beschreibung der Anfahrt vorbereitet hast.
Nun ist es so, dass es verschiedene Möglichkeiten zur Beschreibung gibt:
- Es gibt digitale Karten, die sogar Routingfunktionen bieten.
- Die Beschreibung via Text ist möglich
- Man kann die Anfahrt mithilfe eines Bildes beschreiben.
Zu manchen Items verfügst du über eine bildlich beschreibende Grafik, die den Ort zeigt. Bei einem anderen Item gibt es keine Grafik. Dafür ist die Adresse über Geocoding-Dienste problemlos auffindbar und in einer digitalen Karte anzeigbar. Bei anderen Items ist es so, dass die Position lediglich per Text beschrieben werden kann, weil Insider-Wissen erforderlich ist. Dieses Problemlösen wir in Schritt 2.
Schritt 2 - Die Funktion displayDirection() für mehrere Möglichkeiten verwenden
Für Ungeduldige: Sieh dir den geänderten Programmcode in der Diff-Ansicht[^codeberg.org/astrid/j4examplecode/compare/t27a1..t27a2] an.
administrator/components/com_foos/src/Service/HTML/Direction.php
Zunächst bereiten wir für jede Beschreibungsart eine Klasse vor. Jede Klasse bereitet den Text für die Wegbeschreibung separat und damit übersichtlich auf. In diesem Schritt zeigen wir als nächstes die Beschreibung für jeden Typ an.
administrator/components/com_foos/src/Service/HTML/Direction.php
\defined('_JEXEC') or die;
+use FooNamespace\Component\Foos\Administrator\Service\HTML\Directions\Image;
+use FooNamespace\Component\Foos\Administrator\Service\HTML\Directions\Map;
+use FooNamespace\Component\Foos\Administrator\Service\HTML\Directions\Text;
+
/**
* Directions Helper
*
*/
class Direction
{
+ protected $directionTool1;
+ protected $directionTool2;
+ protected $directionTool3;
+
/**
* Service constructor
*
class Direction
*/
public function __construct()
{
+ $this->directionTool1 = new Image;
+ $this->directionTool2 = new Map;
+ $this->directionTool3 = new Text;
}
/**
public function __construct()
*/
public function displayDirection()
{
- return "The route description";
+ return
+ $this->directionTool1->findDirection() . "<br>" .
+ $this->directionTool2->findDirection() . "<br>" .
+ $this->directionTool3->findDirection();
}
}
administrator/components/com_foos/src/Service/HTML/Directions/Image.php
Nachfolgen siehst du die Klasse, die für die Anzeige des Bildes zuständig ist.
administrator/components/com_foos/src/Service/HTML/Directions/Image.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\HTML\Directions;
+
+\defined('_JEXEC') or die;
+
+/**
+ * Content Component HTML Helper
+ *
+ * @since __DEPLOY_VERSION__
+ */
+class Image
+{
+
+ /**
+ * Service constructor
+ *
+ * @param CMSApplication $application The application
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Method to generate a link to the create item page for the given category
+ *
+ * @param object $category The category information
+ * @param Registry $params The item parameters
+ * @param array $attribs Optional attributes for the link
+ *
+ * @return string The HTML markup for the create item link
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public static function findDirection()
+ {
+ return "Find direction on Image.";
+ }
+}
administrator/components/com_foos/src/Service/HTML/Directions/Map.php
Am komplexesten wird wohl die Erstellung der Route über die digitale Karte, welches die Klasse Map
zur Aufgabe hat.
administrator/components/com_foos/src/Service/HTML/Directions/Map.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\HTML\Directions;
+
+\defined('_JEXEC') or die;
+
+/**
+ * Content Component HTML Helper
+ *
+ * @since __DEPLOY_VERSION__
+ */
+class Map
+{
+
+ /**
+ * Service constructor
+ *
+ * @param CMSApplication $application The application
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Method to generate a link to the create item page for the given category
+ *
+ * @param object $category The category information
+ * @param Registry $params The item parameters
+ * @param array $attribs Optional attributes for the link
+ *
+ * @return string The HTML markup for the create item link
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public static function findDirection()
+ {
+ return "Find direction with a Map.";
+ }
+}
administrator/components/com_foos/src/Service/HTML/Directions/Text.php
Die Klasse names Text
bereitet die textuelle Beschreibung der Anfahrt auf.
administrator/components/com_foos/src/Service/HTML/Directions/Text.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\HTML\Directions;
+
+\defined('_JEXEC') or die;
+
+/**
+ * Content Component HTML Helper
+ *
+ * @since __DEPLOY_VERSION__
+ */
+class Text
+{
+
+ /**
+ * Service constructor
+ *
+ * @param CMSApplication $application The application
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Method to generate a link to the create item page for the given category
+ *
+ * @param object $category The category information
+ * @param Registry $params The item parameters
+ * @param array $attribs Optional attributes for the link
+ *
+ * @return string The HTML markup for the create item link
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public static function findDirection()
+ {
+ return "Find direction via Text Explanation.";
+ }
+}
Wenn du ein Item im Frontend aufrufst, erscheint der Text, den du zur Beschreibung der Anfahrt vorbereitet hast.
Das Problem: Momentan werden alle Arten von Wegbeschreibungen angezeigt und es ist nicht sichergestellt, dass diese Beschreibung existiert. Oft ist nicht jeder Typ verfügbar. Manchmal ist es auch so, dass man festlegen möchte, welcher Typ angezeigt wird. Anstatt alle Typen gleichzeitig verfügbar zu machen, wäre es besser, wenn die optimalen Wegbeschreibungen definiert werden könnten. Auf diese Weise wäre es auch möglich, neue Typen hinzuzufügen oder zu entfernen, ohne Änderungen am bestehenden Code vornehmen zu müssen. Wir werden uns in Schritt 3 ansehen, wie dies möglich ist.
Schritt 3 - Auswahl der Variable displayDirection() und Typsicherheit
Für jedes Element ist die Anfahrtsbeschreibung durch Text, durch Bild oder durch digitale Karte möglich. Es wäre schön, wenn die drei Typen gleichwertig nebeneinander anwendbar wären und wenn sichergestellt wäre, dass es mindestens eine Beschreibung gibt. Betrachten wir in diesem Zusammenhang die Begriffe “Schnittstellen” und “Traits”.
Eine Schnittstelle ist ein Vertrag zwischen der implementierenden Klasse und der aufrufenden Klasse. Der Vertrag stellt sicher, dass jede Klasse, die Schnittstelle implementiert, bestimmte Kriterien erfüllt. Wir haben drei Möglichkeiten. Für jede erstellen wir eine Schnittstelle. Eine Schnittstelle ist so etwas wie ein Vertrag, der sicherstellt, dass Mindestvoraussetzungen eingehalten werden. Diese Schnittstellen implementieren wir dann in den Klassen. Durch die Verwendung eines “Traits” stellen wir sicher, dass wir den Vertrag nicht jedes Mal neu ausschreiben müssen. Wir verwenden Standards. Auf diese Weise funktioniert unser Dienst wie vereinbart!
Weitere Inforamationen zu Traits[^php.net/manual/de/language.oop5.traits.php] und Interfaces[^php.net/manual/de/language.oop5.interfaces.php].
Für Ungeduldige: Sieh dir den geänderten Programmcode in der Diff-Ansicht[^codeberg.org/astrid/j4examplecode/compare/t27a2..t27a3] an.
administrator/components/com_foos/src/Extension/FoosComponent.php
In der Komponentenklasse fügen wir alles Notwendige für den Service Direction
hinzu.
administrator/components/com_foos/src/Extension/FoosComponent.php
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\Component\Router\RouterServiceInterface;
use Joomla\CMS\Component\Router\RouterServiceTrait;
+use FooNamespace\Component\Foos\Administrator\Service\Direction\DirectionServiceInterface;
+use FooNamespace\Component\Foos\Administrator\Service\Direction\DirectionServiceTrait;
/**
* Component class for com_foos
*
* @since __BUMP_VERSION__
*/
-class FoosComponent extends MVCComponent implements BootableExtensionInterface, CategoryServiceInterface, AssociationServiceInterface, RouterServiceInterface
+class FoosComponent extends MVCComponent implements BootableExtensionInterface, CategoryServiceInterface, AssociationServiceInterface, RouterServiceInterface, DirectionServiceInterface
{
use CategoryServiceTrait;
use AssociationServiceTrait;
use HTMLRegistryAwareTrait;
use RouterServiceTrait;
+ use DirectionServiceTrait;
/**
* Booting the extension. This is the function to set up the environment of the extension like
public function boot(ContainerInterface $container)
{
$this->getRegistry()->register('foosadministrator', new AdministratorService);
$this->getRegistry()->register('fooicon', new Icon($container->get(SiteApplication::class)));
- $this->getRegistry()->register('foodirection', new Direction());
}
/**
administrator/components/com_foos/src/Service/Direction/DirectionExtensionInterface.php
Die Datei DirectionExtensionInterface.php
beinhaltet die Schnittstelle DirectionExtensionInterface
welche dafür sorgt, dass die Funktion findDirection()
bei allen implementierenden Klassen verfügbar ist. Vereinfacht ausgedrückt lautet der Vertrag: Wenn eine Klasse die Schnittstelle implementiert, dann bietet sie eine Lösung für die beinhaltenden Funktionen.
administrator/components/com_foos/src/Service/Direction/DirectionExtensionInterface.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\Direction;
+
+\defined('JPATH_PLATFORM') or die;
+
+/**
+ * Direction Extension Interface for the helper classes
+ *
+ * @since __DEPLOY_VERSION__
+ */
+interface DirectionExtensionInterface
+{
+ /**
+ * Method to get the direction for a given item.
+ *
+ * @return string Direction
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public static function findDirection();
+}
administrator/components/com_foos/src/Service/Direction/DirectionServiceInterface.php
DirectionServiceInterface
ist eine weitere Schnittstelle. Sie legt fest, welche Schnittstelle der Service unterstützt und wie diese abrufbar ist. Konkret nutzen wir DirectionExtensionInterface
, welche wir im vorhergehenden Abschnitt besprochen haben. Abrufen können wir diese per getDirectionExtension
. Letzteres werden wir weiter unten in einem konkreten Beispiel durchführen.
administrator/components/com_foos/src/Service/Direction/DirectionServiceInterface.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\Direction;
+
+\defined('JPATH_PLATFORM') or die;
+
+/**
+ * The Direction service.
+ *
+ * @since __DEPLOY_VERSION__
+ */
+interface DirectionServiceInterface
+{
+ /**
+ * Returns the Directions extension helper class.
+ *
+ * @return DirectionExtensionInterface
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function getDirectionExtension(): DirectionExtensionInterface;
+}
administrator/components/com_foos/src/Service/Direction/DirectionServiceTrait.php
Der Trait DirectionServiceTrait
bietet eine Standardimplementierung der Funktionen getDirectionExtension
und setDirectionExtension
, so das unser Vertrag sicher erfüllt ist.
administrator/components/com_foos/src/Service/Direction/DirectionServiceTrait.php
+<?php
+/**
+ * @package Joomla.Site
+ * @subpackage com_foos
+ *
+ * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace FooNamespace\Component\Foos\Administrator\Service\Direction;
+
+\defined('JPATH_PLATFORM') or die;
+
+/**
+ * Trait to implement DirectionServiceInterface
+ *
+ * @since __DEPLOY_VERSION__
+ */
+trait DirectionServiceTrait
+{
+ /**
+ * The direction extension.
+ *
+ * @var DirectionExtensionInterface
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ private $directionExtension = null;
+
+ /**
+ * Returns the directions extension helper class.
+ *
+ * @return DirectionExtensionInterface
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function getDirectionExtension(): DirectionExtensionInterface
+ {
+ return $this->directionExtension;
+ }
+
+ /**
+ * The direction extension.
+ *
+ * @param DirectionExtensionInterface $directionExtension The extension
+ *
+ * @return void
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function setDirectionExtension(DirectionExtensionInterface $directionExtension)
+ {
+ $this->directionExtension = $directionExtension;
+ }
+}
administrator/components/com_foos/src/Service/HTML/Directions/Image.php
Die Klasse Image
soll auf jeden Fall die Funktion findDirection
zur Verfügung stellen. Dies erreichen wir, in dem die Klasse die Schnittstelle DirectionExtensionInterface
implementiert.
administrator/components/com_foos/src/Service/HTML/Directions/Image.php
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
-namespace FooNamespace\Component\Foos\Administrator\Service\HTML\Directions;
+namespace FooNamespace\Component\Foos\Administrator\Service\Direction;
\defined('_JEXEC') or die;
*
* @since __DEPLOY_VERSION__
*/
-class Image
+class Image implements DirectionExtensionInterface
{
/**
administrator/components/com_foos/src/Service/HTML/Directions/Map.php
Die Klasse Map
soll ebenfalls die Funktion findDirection
bieten. Dies erreichen wir, in dem auch diese die Schnittstelle DirectionExtensionInterface
implementiert.
administrator/components/com_foos/src/Service/HTML/Directions/Map.php
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
-namespace FooNamespace\Component\Foos\Administrator\Service\HTML\Directions;
+namespace FooNamespace\Component\Foos\Administrator\Service\Direction;
\defined('_JEXEC') or die;
*
* @since __DEPLOY_VERSION__
*/
-class Map
+class Map implements DirectionExtensionInterface
{
/**
administrator/components/com_foos/src/Service/HTML/Directions/Text.php
Last but not least soll Map
soll die Funktion findDirection
bieten. Deshalb implementiert auch diese die Schnittstelle DirectionExtensionInterface
.
administrator/components/com_foos/src/Service/HTML/Directions/Text.php
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
-namespace FooNamespace\Component\Foos\Administrator\Service\HTML\Directions;
+namespace FooNamespace\Component\Foos\Administrator\Service\Direction;
\defined('_JEXEC') or die;
*
* @since __DEPLOY_VERSION__
*/
-class Text
+class Text implements DirectionExtensionInterface
{
/**
administrator/components/com_foos/src/Service/HTML/Direction.php
Die Klasse administrator/components/com_foos/src/Service/HTML/Direction.php
benötigen wir nicht weiter. Wir löschen diese.
administrator/components/com_foos/src/Service/HTML/Direction.php
-<?php
-/**
- * @package Joomla.Site
- * @subpackage com_foos
- *
- * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
- * @license GNU General Public License version 2 or later; see LICENSE.txt
- */
-
-namespace FooNamespace\Component\Foos\Administrator\Service\HTML;
-
-\defined('_JEXEC') or die;
-
-use FooNamespace\Component\Foos\Administrator\Service\HTML\Directions\Image;
-use FooNamespace\Component\Foos\Administrator\Service\HTML\Directions\Map;
-use FooNamespace\Component\Foos\Administrator\Service\HTML\Directions\Text;
-
-/**
- * Directions Helper
- *
- * @since __DEPLOY_VERSION__
- */
-class Direction
-{
- protected $directionTool1;
- protected $directionTool2;
- protected $directionTool3;
-
- /**
- * Service constructor
- *
- * @since __DEPLOY_VERSION__
- */
- public function __construct()
- {
- $this->directionTool1 = new Image;
- $this->directionTool2 = new Map;
- $this->directionTool3 = new Text;
- }
-
- /**
- * Method to generate a routing direction
- *
- * @return string The HTML markup for the direction
- *
- * @since __DEPLOY_VERSION__
- */
- public function displayDirection()
- {
- return
- $this->directionTool1->findDirection() . "<br>" .
- $this->directionTool2->findDirection() . "<br>" .
- $this->directionTool3->findDirection();
- }
-}
components/com_foos/tmpl/foo/default.php
Bei der Darstellung im Frontend können wir die Komponentenklasse über $fooComponent = Factory::getApplication()->bootComponent('com_foos')
laden und die Schnittstelle $fooComponent->setDirectionExtension(new DirectionMap)
zur Laufzeit dynamisch neu setzen. Auf diese Weise ist es möglich, verschiedene Implementierungen für die Ausgabe findDirection()
zu verwenden. Um sicherzustellen, dass die Methode findDirection()
immer verfügbar ist, implementieren wir in den möglichen DirectionExtensions DirectionExtension
das Interface DirectionExtensionInterface
.
components/com_foos/tmpl/foo/default.php
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
+use FooNamespace\Component\Foos\Administrator\Service\Direction\Map as DirectionMap;
+use FooNamespace\Component\Foos\Administrator\Service\Direction\Text as DirectionText;
+use FooNamespace\Component\Foos\Administrator\Service\Direction\Image as DirectionImage;
$canDo = ContentHelper::getActions('com_foos', 'category', $this->item->catid);
$canEdit = $canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == Factory::getUser()->id);
</div>
<?php endif; ?>
+<?php
+ $fooComponent = Factory::getApplication()->bootComponent('com_foos');
+?>
+<hr>
+<?php
+ $fooComponent->setDirectionExtension(new DirectionMap);
+ echo $fooComponent->getDirectionExtension()->findDirection();
+?>
<hr>
-<?php echo HTMLHelper::_('foodirection.displayDirection', $this->item, $tparams); ?>
+<?php
+ $fooComponent->setDirectionExtension(new DirectionText);
+ echo $fooComponent->getDirectionExtension()->findDirection();
+?>
+<hr>
+<?php
+ $fooComponent->setDirectionExtension(new DirectionImage);
+ echo $fooComponent->getDirectionExtension()->findDirection();
+?>
<hr>
<?php
Wenn du ein Item im Frontend aufrufst, erscheint der Text, den du zur Beschreibung der Anfahrt vorbereitet hast. In dem Beispiel zeige ich zu Demonstrationszwecken noch alle möglichen Varianten an. Meiner Meinung nach wird aber deutlich, wie unkompliziert es ist, die Ausgabe zur Laufzeit zu ändern oder mit Hilfe von Parametern zu manipulieren. Parametern ist ebenfalls ein eigenes Kapitel in diesem Tutorial gewidmet.
Warum Dependency Injection?
In diesem Abschnitt siehst du ein einfaches Beispiel. Es beinhaltet die Grundlagen von DI. Die Übergabe der Anforderungen für eine Klasse an die Klasse über eine set
-Methode, wobei die set
-Methode typischerweise dem Namen der Eigenschaft entspricht. In unserem Fall ist dies DirectionExtension
: Wir möchten die Extension festlegen, welche die Direction
ausgibt.
Warum Container?
Ein Inversion of Control (IoC) Container kann helfen, alle Teile der Anwendung zu verwalten. Anstatt jedes Mal eine neue DirectionExtension
zu erstellen, ist es viel einfacher, sich zu merken, wie man eine DirectionExtension
vorbereitet. Da die DirectionExtension
in unserem Beispiel nicht viele Abhängigkeiten hat, sind die Vorteile eines Containers schwer zu erkennen. Aber stell dir vor, dass du jedes Mal, wenn du eine DirectionExtension
erstellst, daran denken musst, die Abhängigkeiten wie impementiere die Schnittstelle DirectionExtensionInterface
und bietet die Methode findDirection
zu übergeben. Mit einem Container ist es möglich alles wie in einer Art Template einzurichten und die Erstellung der Anwendung zu überlassen. Das ist erst recht praktisch, wenn die Abhängigkeiten, die wir injizieren, Abhängigkeiten innerhalb ihrer Abhängigkeiten haben. Das alles kann sehr komplex werden. Beispiel findest du in den ../services/provider.php
Dateien, beispielsweise in /administrator/components/com_foos/services/provider.php
.
Links
Dependency Injection bei Wikipedia[^de.wikipedia.org/wiki/dependency_injection]
JAB18: Services in Joomla 4[^joomla.digital-peak.com/images/blog/jab18_services_in_joomla_4.pdf]
Implementierung der Services in der Komponenten Klasse auf Github[^github.com/joomla/joomla-cms/pull/20217]
Warum Dependency Injection in Joomla 4[^github.com/joomla-framework/di/blob/2.0-dev/docs/why-dependency-injection.md]