Hubert

Konfiguration

Hubert wird komplett über einen Array Konfiguriert.

Konfigurations-Komponenten

es gibt vier Bereiche, welche konfiguriert werden können:

Namespaces

In diesem Bereich definiert man Namespaces mit dem dazugehörigen Ordner für den Autoloader:

"namespace" => array(
    "app" => "app/"
),

In diesem Beispiel wird der Namespace "app" für einen gleichnamigen Ordner definiert. Zum Beispiel könnte in der Datei app/bootstrap.php eine PHP-Klasse mit dem Namen "bootstrap" und dem Namespace "app" liegen. Wenn nun beispielsweise in den Routen die Klasse $bootstrap = new \app\bootstrap() verwendet wird, wird diese Datei automatisch per include geladen. Dies wird später im Bereich MVC dieser Dokumentation verwendet.

Factories

Factories sind statische Funktionen, welche einen Service initialisieren.

"factories" => array(
    "router" => array(\hubert\service\router::class, 'factory'),
),

Dies ist ein Beispiel aus der Standardkonfiguration von Hubert (und muss deshalb nicht in der eigenen Konfiguration angegeben werden). Hier wird in der Klasse "router", welche im Namespace "hubert\service" liegt, die statische Funktion "factory" als Initiator für den Router definiert. Diese Funktion gibt also den Router als Objekt zurück. Der definierte Service ist dann über hubert()->router global verfügbar und wird erst bei seiner erstmaligen Verwendung initialisiert. Genauso können eigene Services eingebunden werden.

Einstellungen

Einstellungen sind zum Beispiel Strings oder Booleans, welche in Services zu dessen Konfiguration genutzt werden. Die hier im Beispiel definierte Einstellung wäre global über hubert()->config->logger['path'] verfügbar.

"config" => array(
    "logger" => array(
        "path" => "logs/"
    )
),

Routen

In diesem Konfigurationsbereich werden die Routen definiert. Mehr zu Routen findest du im Bereich Routing dieser Dokumentation.

"routes" => array(
    "home" => array(
        "route" => "/",
        "method" => "GET|POST",
        "target" => function(){
            echo "Hello World";
        }
    ),
),

Laden der Konfiguration

Die Konfiguration muss immer beim erstmaligen Aufruf der hubert() Funktion übergeben werden. Dazu gibt mehrere Möglichkeiten:

Konfiguration in einem Array

Im "Hello World"-Beispiel wurde die Konfiguration als Array definiert – dies ist vor Allem für sehr kleine Anwendungen gedacht.

$config = array(
    "routes" => array(
        "home" => array(
            "route" => "/", 
            "target" => function($request, $response, $args){
                echo "Hello World";
            }
        )
    )
);

hubert($config);

Konfiguration in Datei

Diesen Array kann man auch in eine seperate Datei auslagern. Zum Beispiel eine config.php Datei.

return array(
    "routes" => array(
        "home" => array(
            "route" => "/", 
            "target" => function($request, $response, $args){
                echo "Hello World";
            }
        )
    )
);

Bei der initialisierung kann man nun diese Datei statt einem Array übergeben:

hubert("config.php");

Konfiguration über einen Ordner

Dies ist der beste Weg zur Konfiguration von Hubert. Dabei wird ein Ordner /config angelegt und die Konfigurationen werden nach Thema sortiert in verschiedenen Dateien abgelegt. Geladen werden die Konfigurationen indem man Hubert beim initialisieren den Pfad zu diesem Ordner gibt:

$app->loadConfig('config/');

Dabei gibt es drei verschiedene Endungen für die Konfigurationsdatein in diesen Ordner. Wenn verschiedene Dateien die gleiche Konfiguration beinhalten, entscheidet die Endung, welche Konfiguration gilt:

Hier ein kleines Beispiel zur Verdeutlichung: Wir haben eine Datei config/general.global.php in welcher wir eine Route definieren und eine Einstellung, dass Fehler nicht angezeigt werden sollen:

<?php
return array(
    "config" => array(
        "display_errors" => false
    ),
    "routes" => array(
        "home" => array(
            "route" => "/", 
            "target" => function($request, $response, $args){
                echo "Hello World";
            }
        )
    )
);

In Deiner lokalen Entwicklungsumgebung legst Du noch eine Datei config/general.local.php an, in welcher Du definierst, dass Du Fehlermeldungen sehen möchtest:

<?php
return array(
    "config" => array(
        "display_errors" => true
    )
);

Die Einstellung display_errors ist nun also in beiden Dateien enthalten. Beim initialisieren von Hubert werden nun die Arrays zusammengeführt. Da die Einstellung display_errors in der Datei, welche auf .local.php endet auf true steht, gilt dieser Wert, denn die lokale Konfiguration hat vor allen anderen Einstellungen Vorrang.

Cache

Bei der Konfiguration über Ordner können schnell sehr viele Konfigurations-Dateien entstehen. routes.global.php, database.global.php, database.local.php, template.global.php sind nur einige Beispiele. Hubert kann diese in einer Cache-Datei zusammenführen und lädt dann bei jedem weiteren Request die Konfiguration aus diesem Cache. Damit die Konfiguration gecached werden kann, ist es wichtig, dass diese serialisierbar ist. Dies bedeutet, dass zum Beispiel Routen nicht mehr als anonyme Funktion definiert werden, sondern über Referenzen.

Im MVC-Tutorial sieht man eine solche Konfiguration. Wenn du dir unsicher bist, dann cache die Konfiguration lieber nicht. Zum cachen übergibt man als zweiten Parameter in der Initialisierung den Pfad zu einer Cache-Datei. Für diese Datei müssen schreibrechte gesetzt sein.

$app->loadConfig('config/', 'cache/config.php');