Das Laden der Konfiguration über den hier beschriebenen Weg gilt nur für auf Symfony basierende Projekte

Das Kunden-Projekt und Module, die vom Kunden-Projekt verwendet werden, stellt SiteKit spezifische Konfigurationen und Sprachdefinitionen bereit. Zusammen mit den Basis-Konfiguration des SiteKit wird in der Warmup-Phase ein Config- und Translation-Cache aufgebaut.

Da das Kunden-Projekt für verschiedene Mandanten (Spinon-Szenario) und verschiedenen Publikationsbereichen verwendet werden und diese unterschiedliche Konfigurationen haben können, müssen für alle Varianten separate Caches aufgebaut werden.

Die Variante werden über SP\SiteKit\ConfigSet und SP\SiteKit\TranslationSet angegeben. Beide Konstruktoren erwarten einen Mandanten-Anchor oder *, wenn die Konfiguration Mandatenunabhängig ist und eine Publisher-Nature oder *, wenn die Konfiguration Publisherunabhängig ist.

Kunden-Module habe in der Regel Mandantenspezifische Konfigurationen. Die vom SiteKit bereitgestellte Basis-Konfiguration und Module-Konfigurationen in Mandantenunspezifisch.

Kundenspezifischer ConfigLoader

Um eine Kunden-Konfiguration bereitzustellen muss das ConfigLoaderProvider-Interface implementiert und am DI-Container angemeldet werden.

src/SP/RuesselsheimHoopoe/Service/ConfigLoader.php

<?php declare(strict_types=1);

namespace SP\RuesselsheimHoopoe\Service;

use SP\SiteKit\Config;
use SP\SiteKit\ConfigSet;
use SP\SiteKit\Provider\ConfigLoaderProvider;

/**
 * Loader der in Symfony-Projekte verwendet, wird um die Konfiguration zu laden.
 */
class ConfigLoader implements ConfigLoaderProvider {

	/** @var string */
	private $projectDir;

	public function __construct(string $projectDir) {
		$this->projectDir = $projectDir;
	}

	public function getConfigSets(): array {
		return [new ConfigSet('ruesselsheim-hoopoe')];
	}

	public function loadConfig(ConfigSet $configSet, Config $config) {
		$config->loadConfig($this->projectDir . '/src/config');
	}
}

Wichtig ist hier, dass der ConfigLoader im Kunden-Projekt ein ConfigSet mit dem Mandanten-Anchor definiert. Alle anderen Module geben hier Wildcards an, wenn die Konfiguration Mandantenunspezifisch ist. Zu beachten ist: Gibt es kein Konfigurations-Set mit einem Anchor, wird kein Konfiguration-Cache in der Warmup-Phase erzeugt.

Der Service muss noch angemeldet werden:

config/services.yaml

    SP\RuesselsheimHoopoe\Service\ConfigLoader:
        arguments:
          - "%kernel.project_dir%"
        tags: ['sitekit.config.loader']

Im Warmup-Prozess werden für alle angemeldeten ConfigLoader die ConfigSets gesammelt und ermittelt, für welche Varianten ein Konfigurations-Cache erstellt werden soll. Gibt es kein Mandanten-Spezfisches ConfigSet, existiert keine spezifische Konfiguration und es wird kein Cache angelegt.

Existiert keine publikationsspezifische Konfiguration wird nur für den Default internet die Konfiguration erstellt.

ConfigLoader für Module

Im Normalfall liefern Module keine Mandanten- oder Publikationsspezifische Konfigurationen. In dem Fall muss kein ConfigSet definiert werden und der ConfigLoader sieht wie folgt aus:

<?php declare(strict_types=1);

namespace SP\AnyModule\Service;

use SP\SiteKit\Config;
use SP\SiteKit\ConfigSet;
use SP\SiteKit\Provider\ConfigLoaderProvider;

class ConfigLoader implements ConfigLoaderProvider {

	public function getConfigSets(): array {
		return [];
	}

	public function loadConfig(ConfigSet $configSet, Config $config) {
		$config->loadConfig(__DIR__ . '/../../../config');
	}
}

ConfigLoader mit verschiedenen ConfigSets

Sollen ConfigLoader Konfigurationen für verschiedene ConfigSets laden, müssen zunächst die nötigen ConfigSets angegeben werden.

	public function getConfigSets(): array {
		return [
            new ConfigSet('clientA')
            new ConfigSet('clientB', 'intranet')
            new ConfigSet('clientB', 'd115')
        ];
	}

Zusammen mit allen anderen ConfigSets werden die resultierenden ConfigSets ermittelt und die an loadConfig() übergeben, um die entsprechende Konfiguration zusammenzustellen. In diesem Fall könnte das z.B. so aussehen:

	public function loadConfig(ConfigSet $configSet, Config $config) {
		$config->loadConfig(
            $this->projectDir .
            '/src/config/main/'
        );
		$config->loadConfig(
            $this->projectDir .
            '/src/config/client/' .
            $configSet->getClientAnchor()
        );
		$config->loadConfig(
            $this->projectDir .
            '/src/config/channelNature/' .
            $configSet->getChannelNature()
        );
	}

Es ginge auch noch einen Schritt weiter, wenn es pro Mandanten auch noch Publikationsspezifisch werden muss:

	public function loadConfig(ConfigSet $configSet, Config $config) {
		$config->loadConfig(
            $this->projectDir .
            '/src/config/main/'
        );
		$config->loadConfig(
            $this->projectDir .
            '/src/config/client/' .
            $configSet->getClientAnchor()
        );
		$config->loadConfig(
            $this->projectDir .
            '/src/config/channelNature/main/' .
            $configSet->getChannelNature() .
        );
		$config->loadConfig(
            $this->projectDir .
            '/src/config/channelNature/client/' .
            $configSet->getClientAnchor() . '/' .
            $configSet->getChannelNature()
        );
	}

Die Implementierung kann individuell so gestaltet werden wie es die Anforderung erfordert.

TranslationLoader

TranslationLoader sind genauso zu verwendend wie ConfigLoader. Für die Varianten werden TranslationSet’s verwendet. Zusätzlich zu der Angabe von Mandanten- und Publsiherspezifikas muss noch ein local angegeben werden, für welche Sprache die aktuellen Definitionen sind.

Ein Translation-Loader kann wie folgt aufgebaut sein:

<?php declare(strict_types=1);

namespace SP\RuesselsheimHoopoe\Service;

use SP\SiteKit\Provider\TranslationLoaderProvider;
use SP\SiteKit\TranslationSet;
use SP\SiteKit\Translator;

/**
 * Loader der in Symfony-Projekte verwendet, wird um die Sprach-Definitionen zu laden.
 */
class TranslationLoader implements TranslationLoaderProvider {

	/** @var string */
	private $projectDir;

	public function __construct(string $projectDir) {
		$this->projectDir = $projectDir;
	}

	/**
	 * @return TranslationSet[]
	 */
	public function getTranslationSets(): array {

		$translationSets = [];

		$localesToCache = ['de_DE'];

		foreach ($localesToCache as $local) {
			$translationSets[] = new TranslationSet(
				$local,
				'ruesselsheim-hoopoe',
				'internet');
		}
		return $translationSets;
	}

	/**
	 * @return void
	 */
	public function loadTranslation(TranslationSet $translationSet, Translator $translator) {
		$translator->addTranslation($this->getTranslationBaseDir());
	}

	private function getTranslationBaseDir(): string {
		return $this->projectDir . '/src/lang';
	}
}

Der Translator, der der Methode loadTranslation() übergeben wird, ist schon Sprachspezifisch und die Methode addTranslation() erwartet ein Basis-Verzeichnis unter dem Verzeichnisse wie de und de_DE liegen.

RuntimeConfigLoader

Die oben beschriebenen ConfigLoader und TranslationLoader werden in der Warmup-Phase ausgeführt und erstellen einen statischen Cache.

Manchmal ist es aber auch notwendig Konfigurationen zur Laufzeit anzupassen. Dazu kann ein RuntimeConfigLoader implementiert werden.

Hier ein Beispiel dafür:

<?php declare(strict_types=1);

namespace SP\CityGov\Service;

use SP\SiteKit\Config;
use SP\SiteKit\Provider\RuntimeConfigLoaderProvider;
use SP\SiteKit\Resource;

class RuntimeConfigLoader implements RuntimeConfigLoaderProvider {

        public function loadConfig(Resource $resource, Config $config): void {
                if (strpos($resource->getObjectType(), 'citygov') === 0) {
                        // Damit diese Komponente NICHT in alle Webseiten eingebaut wird,
                        // wird sie hier und nicht in der componentenMode.html.php angegeben.
                        $config->set('componentModel.html.components', array(
                                'citygov-initialization' => ['type' => 'citygov.initialization']
                        ));
                }
        }
}