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.