Dependency Container: Unterschied zwischen den Versionen

Aus Contao Community Documentation

(Die Seite wurde neu angelegt: „{{ExtInfo | Dev=Benutzer:tril | DevSite=http://bit3.de | Version=ab 2.11 | ERLink=https://github.com/bit3/contao-dependency-container | TrackerLink=http://dev…“)
 
(Services)
 
(3 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt)
Zeile 4: Zeile 4:
 
| Version=ab 2.11
 
| Version=ab 2.11
 
| ERLink=https://github.com/bit3/contao-dependency-container
 
| ERLink=https://github.com/bit3/contao-dependency-container
| TrackerLink=http://dev.contao-forge.org/projects/avisota/issues
+
| TrackerLink=https://github.com/bit3/contao-dependency-container/issues
 
}}
 
}}
 
[[Kategorie:Extensions]]
 
[[Kategorie:Extensions]]
Zeile 15: Zeile 15:
 
DI umfasst neben Komponenten (wie den Container) auch Programmierparadigmen und API Definitionen und muss daher von jedem Entwickler selbst "angewendet" werden.
 
DI umfasst neben Komponenten (wie den Container) auch Programmierparadigmen und API Definitionen und muss daher von jedem Entwickler selbst "angewendet" werden.
  
==Was macht der Container?==
+
==How to use==
  
Der Container ist ein zentraler Speicherort für Parameter und Dienste.
+
Technisch wird der [https://github.com/fabpot/Pimple Pimple] Container verwendet.
Parameter und Dienste haben einen Namen, damit ist der Container prinzipiell nichts anderes als ein <code>Key &rarr; Value</code> Storage.
+
  
===Parameter===
+
===Zugriff auf Werte im Container===
  
Parameter sind vergleichbar mit Konfigurationseinstellungen.
 
Innerhalb von Contao machen diese prinzipiell kaum Sinn, da es dort das <code>$GLOBALS['TL_CONFIG']</code> Array gibt.
 
Mit Ihnen lassen sich aber Dienste gut konfigurieren.
 
 
===Dienste (Services)===
 
 
Dienste sind Objekte die bestimmte Funktionen zur Verfügung stellen und vom Container bei Anforderung instanziiert und zur Verfügung gestellt werden.
 
Ob ein Dienst bei jedem Aufruf neu erzeugt wird oder aber als Singleton innerhalb des Containers verbleibt entscheidet der Container.
 
 
==Wieso ein DI Container?==
 
 
In Contao werden für Dienste häufig Singleton Klassen eingesetzt.
 
Singleton Klassen lassen sich allerdings nur schwer modifizieren oder rekonfigurieren.
 
 
==Technische Umsetzung==
 
 
Der Dependency Container verwendet die [http://symfony.com/doc/2.1/components/dependency_injection/index.html Dependency Injection Component] von Symfony2.
 
 
==Zugriff auf den Container==
 
 
Der Container steht als globales Objekt zur Verfügung:
 
 
<source lang="php">
 
<source lang="php">
$GLOBALS['container']->get('foo.bar');
+
$value = $GLOBALS['container']['foo.bar'];
 
</source>
 
</source>
 
oder
 
oder
 
<source lang="php">
 
<source lang="php">
 
global $container;
 
global $container;
$container->get('foo.bar');
+
$value = $container['foo.bar'];
 
</source>
 
</source>
  
=Parameter und Dienste konfigurieren=
+
===Werte im Container definieren===
 +
 
 +
Services werden in Modulen über die <code>system/modules/X/config/services.php</code>
 +
oder lokal über die <code>system/config/services.php</code> definiert.
 +
 
 +
====Parameter====
  
Ein Dienst wird mit <code>register</code> registriert:
 
 
<source lang="php">
 
<source lang="php">
$container->register('myServiceName', 'MyClassName')
+
$GLOBALS['container']['myServiceParameter'] = 'value';
    ->addArgument('myConstructorArgument')
+
    ->addMethodCall('myMethodName', array('myMethodArgument'));
+
 
</source>
 
</source>
Das Beispiel registriert einen Dienst '''myServiceName''',  mit der Klasse '''MyClassName'''.
+
oder
Außerdem wird ein Argument mit dem Wert <code>'myConstructorArgument'</code> hinzugefügt, das beim Instanziieren an den Konstruktor übergeben wird.
+
Anschließend wird noch die Methode '''myMethodName''' aufgerufen, mit dem Parameter <code>'myMethodArgument'</code>.
+
 
+
Umgesetzt im PHP Code entspricht dies:
+
 
<source lang="php">
 
<source lang="php">
$myServiceName = new MyClassName('myConstructorArgument');
+
global $container;
$myServiceName->myMethodName('myMethodArgument');
+
$container['myServiceParameter'] = 'value';
 
</source>
 
</source>
  
Parameter lassen sich einfach mit <code>setParameter</code> definieren:
+
====Services====
 +
 
 
<source lang="php">
 
<source lang="php">
$container->setParameter('myservice.myproperty', 'myValue');
+
$GLOBALS['container']['myServiceName'] = function($container) {
 +
    $object = new MyClassName($container['myConstructorArgument']);
 +
    $object->myMethodName('myMethodArgument');
 +
    return $object;
 +
};
 
</source>
 
</source>
Parameter können auch komplexe Werte wie Arrays und Objekte beinhalten.
+
oder
 
+
Parameter können mit <code>getParameter</code> wieder abgefragt werden oder mit '%<parameter name>%' innerhalb der Service-Konfiguration wieder verwendet werden.
+
 
<source lang="php">
 
<source lang="php">
$container->register('myServiceName', 'MyClassName')
+
global $container;
     ->addArgument('%myservice.myproperty%')
+
$container['myServiceName'] = function($container) {
 +
    $object = new MyClassName($container['myConstructorArgument']);
 +
     $object->myMethodName('myMethodArgument');
 +
    return $object;
 +
};
 
</source>
 
</source>
 
Welche Möglichkeiten der Container genau liefert, lässt sich in der [http://symfony.com/doc/2.1/components/dependency_injection/introduction.html#basic-usage Basic usage] nachlesen.
 
 
==services.php, services.yml, services.xml==
 
 
Konfiguriert wird der Container innerhalb einer <code>services.php</code>, <code>services.yml</code> oder <code>services.xml</code>, die innerhalb des <code>config/</code> Verzeichnisses im Modul abgelegt werden muss. Die einfachste Möglichkeit ist natürlich über die <code>services.php</code>, wie im oben gezeigtem Beispiel. Wie die Konfiguration mittels <code>services.yml</code> bzw. <code>services.xml</code> funktioniert, kann den Kapiteln [http://symfony.com/doc/2.1/components/dependency_injection/introduction.html#setting-up-the-container-with-configuration-files Setting Up the Container with Configuration Files] und [http://symfony.com/doc/2.1/components/dependency_injection/parameters.html#parameters-in-configuration-files Parameters in Configuration Files] entnommen werden.
 
 
===lokale services.php, services.yml, services.xml===
 
 
Um die Parameter und Services lokal zu überschreiben kann eine <code>services.php</code>, <code>services.yml</code> oder <code>services.xml</code> in <code>system/config/</code> hinterlegt werden.
 
 
=Verwenden von TL_CONFIG Einträgen=
 
 
Die Einträge aus <code>$GLOBALS['TL_CONFIG']</code> sind als Parameter mit dem Prefix <code>contao.</code> registriert, z.B. entspricht <code>contao.adminEmail</code> der Variable <code>$GLOBALS['TL_CONFIG']['adminEmail']</code>.
 

Aktuelle Version vom 16. Mai 2013, 20:42 Uhr

Erweiterungs-Übersicht
Name des Entwicklers Benutzer:tril
Entwickler Webseite http://bit3.de
Kompatibilität mit Contao Version ab 2.11
Link zum Extension Repository https://github.com/bit3/contao-dependency-container
Link zum Tracker https://github.com/bit3/contao-dependency-container/issues

Dependency Container für Contao

Ein Dependency Container ist Teil des Dependency Injection Konzepts. Deshalb bezeichnet man ihn auch als Dependency Injection Container oder kurz DI Container. Die Erweiterung heißt deshalb nur "Dependency Container", weil diese lediglich einen Container für Abhängigkeiten gemäß dem DI Konzept bereit stellt. DI umfasst neben Komponenten (wie den Container) auch Programmierparadigmen und API Definitionen und muss daher von jedem Entwickler selbst "angewendet" werden.

How to use

Technisch wird der Pimple Container verwendet.

Zugriff auf Werte im Container

$value = $GLOBALS['container']['foo.bar'];

oder

global $container;
$value = $container['foo.bar'];

Werte im Container definieren

Services werden in Modulen über die system/modules/X/config/services.php oder lokal über die system/config/services.php definiert.

Parameter

$GLOBALS['container']['myServiceParameter'] = 'value';

oder

global $container;
$container['myServiceParameter'] = 'value';

Services

$GLOBALS['container']['myServiceName'] = function($container) {
    $object = new MyClassName($container['myConstructorArgument']);
    $object->myMethodName('myMethodArgument');
    return $object;
};

oder

global $container;
$container['myServiceName'] = function($container) {
    $object = new MyClassName($container['myConstructorArgument']);
    $object->myMethodName('myMethodArgument');
    return $object;
};
Ansichten
Meine Werkzeuge

Contao Community Documentation

<user> Kann es sein, dass sich SyncCto bei Sync->Client anders verhält als umgegekehrt also Sync->Server ?
<xtra> ja, da laufen die Daten in die andere Richtung *scnr*

Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge