Model-Factory

Models sollen nicht mit Ihrem Konstruktor erzeugt werden, sondern über die Model-Factory. Damit existiert eine zentrale stelle über die Models erstellt werden. Dies hat den Vorteil, dass ggf noch zentrale Logik für betimmte Models hinzugefügt werden kann.

Models können in Komponenten, Controllern, Models und Renderern über zwei Methoden erzeugt werden

createModel($data)

$this->createModel($data, $subType = null);

$data kann ein array, ein Model oder null sein. Wird ein array übergeben wird erwartet, dass ein Key modelType existiert, mit der die Klasse des Models ermittelt werden kann. Mit der ermittelten Klasse wird das Model erzeugt. Über das Model-Mapping (php/config/model/typeMapping.php) können Typen auf Model-Klassen gemappt werden.

php/config/model/typeMapping.php

<?php
return array(
	'whitelabel.*' => 'SP\Whitelabel\Model'
);

Bei dem obigen Beispiel wird der ModelType whitelabel.myNamespace.myModel auf die Klasse \SP\Whitelabel\Model\MyNamespace\MyModel gemappt.

Ist $data schon ein Model wird dieses ggf. noch von der Model-Factory verarbeitet (siehe Model-Handler) und dann zurück gegeben.

Wird für $data null übergeben, wird auch null zurückgegeben.

In Models werden häufig gesamte Model-Strukturen über ein assoziatives Array erzeugt. Hierbei nimmt eine setter-Methode Daten entgegen und erzeugt daraus ein Model. Für diese Fälle kann die Logik mit Hilfe von createModel($data) vereinfacht werden. Dies kann dann so aussehen:

public function setLink($link) {
	$this->link = $this->createModel($link, \SP\SiteKit\Model\Content\Link\Link::class);
}
public function getLink() {
	return $this->link;
}

Die Angabe eines $subType sorgt dafür, das von createModel null geliefert wird, wenn der modelType keinen Link beschreibt. Damit ist sichergestellt das $this->link immer nur Link-Objekte enthält.

Hinweis: Die Methoden createModel() und createModelByType können innerhalb von Models nur verwendet werden, wenn das Model selber von einer Model-Factory erzeugt wurde, da dem Model nur dann die Model-Factory bekannt ist. Für das Model einer Komponente wird die Model-Factory automatisch gesetzt.

createModelByType($type, $data = null)

$this->createModelByType($ype, $data = null);

In einigen Fällen entält $data kein modelType oder wird garnicht angegeben. Damit auch für diese Fälle Models über die Model-Factory erzeugt werden könnne, kann über diese Methode ein Type angegeben werden. Hiermit es es auch möglich leere Models zu erzeugten, die dann programmatisch büer deren setter-Methoden gefüllt werden.

ModelFactory-Handler

Über einen ModelFactory-Handler kann nach der Erstellung eines Models noch Logik angewendet werden. Ein ModelFactory-Handler muss ein Controller sein (erbt von SP\SiteKit\Controller\Controller) und das Interface SP\SiteKit\Model\Model\ModelFactoryHandler implementieren.

In den meisten Fällen ist es sinnvoll, ModelFactory-Handler nur für bestimmte Komponenten zu aktivieren. Dazu kann in der Komponenten-Konfiguration z.B. folgender Eintrag definiert werden.

return [
	'modelFactory' => [
		'handler' => [
			'myHandler' => [
				'id' => 'myHandler',
				'type' => 'referenceResolver.myHandler'
			]
		]
	]
];

Das Type-Mapping erfolg in der Datei php/config/controller/typeMapping.

Reference-Resolver

Der Reference-Resolver ist ein implementierter ModelFactory-Handler, der verwendet wird um Referencen aufzulösen. Er wird beispielsweise verwendet, um für Teaserlisten aus Reference-Models Teaser-Models zu erzeugen. Er wird für einzelne Komponenten konfiguriert. Konfigurtion der TeaserList-Komponente

	'modelFactory' => [
		'handler' => [
			'referenceResolverManager' => [
				'id' => 'referenceResolverManager',
				'type' => 'referenceResolver.manager',
				'resolverTypes' => [

					'internalNewsTeaser',
					'internalEventTeaser',
					'internalSearchTip',
					'internalTeaser',

					'externalEventTeaser',
					'externalMediaTeaser',
					'externalTeaser'
				]
			]
		]
	]

Die einzelnen Resolver prüfen die Referenz, um zu entscheiden, ob sie die Referenz auflösen können. Der internalNewsTeaser-Resolver z.B. erzeugt News-Teaser-Models nur für Resourcen vom Type ‘news’. Die einzelnen Resolver werden nacheinander aufgerufen, bis ein Model aufgelöst wurde. Kann kein Resolver die Referenz auflösen wird null zurückgeliefert.