Komponent-Modell
Das Komponenten-Modell wird mit SP\SiteKit\Instanciator.php
instanziert.
Ausschlaggebend sind zwei Methoden dieser Klasse:
newInstance(…)
newInstance Kreiert die mit getClassName(…) ermittelte Klasse. Dies wird mit einer ReflectionClass gemacht. Außerdem werden implizit die Argumente zu dieser Klasse hinzugefügt.
/**
* Instanziiert ein neues Objekt mit dem angegebenen Type.
*
* Optional können noch Argumente des Konstruktors angegeben werden.
*
* @param string $type Type der Instanziiert werden soll
* @param array $arguments Argumente, die dem Konstruktor der Klasse übergeben werden sollen.
* @return object|null Die neu erzeugte Instanz oder <tt>null</tt>, wenn der Type nicht zu einer
* Klasse aufgelöst werden konnte.
*/
public function newInstance($type, $arguments = null) {...}
[...]
$ref = new \ReflectionClass($className);
if ($arguments !== null) {
$f = $ref->newInstanceArgs($arguments);
return $f;
} else {
return $ref->newInstance();
}
[...]
getClassName($type)
Die Methode durchsucht die Config für die mit $type übermittelten String. Drei Cases werden durchlaufen ‘einsZuEinsMapping’ ‘type.mit.Punkten’ ‘type.mit.*.in.der.Konfig’
TODO: Fälle spezifizieren und besser begründen.
/**
* Liefert den Klassennamen anhand des Types
* @internal
* @param string $type
* @return string Klassenname der auf den Typ gemappt ist oder <tt>null</tt>, wenn für diesen Type kein
* Klassenname aufgelöst werden kann.
* @return string|null
*/
public function getClassName($type) {...}
Die Konfig
Der Instanciator holt sich seine Konfig u.a. aus ../Kundenmodul/Kundenmodul-module/src/publish/php/layout-...
und ../Kundenmodul/Kundenmodul-module/src/publish/php/config/componentModel/html.php
.
Die im Layout aufzurufenden Klassen werden durch die html.php spezifiziert. Überlicherweise steht im layout
<?php $this->render('html-bodyHead'); ?>
Dies wird mit html.php auf eine Komponente gemappt.
'components' => array(
/**
* Komponenten die für die Grundfunktionaltität des SiteKit notwendig sind.
* Alle weiteren Komponenten werden in Kunden- oder Applikations-Modulen definiert
*/
[...]
'html-bodyHead' => ['type' => 'html.bodyHead'],
[...]
TODO: Warum gibt es die Trennung von layout-content und html.php ?