TYPO3 Context verstehen und anwenden

In TYPO3 CMS 6.2 wurde offiziell die Unterstützung für einen TYPO3 Kontext (TYPO3_CONTEXT) hinzugefügt.
Da ich aber – außer im Quellcode – keine Dokumentation dafür gefunden habe, soll dieser Artikel den Nutzen und die Anwendung
des TYPO3_CONTEXT erläutern.

Was ist der TYPO3_CONTEXT?

Technisch gesehen ist der TYPO3_CONTEXT eine Umgebungsvariable die beispielsweise über den Web-Server (z. B. Apache HTTP Server) gesetzt wird.
Diese Umgebungsvariable kann über Methoden abgefragt werden die von TYPO3 bereitgestellt werden.

Ferner kann der TYPO3_CONTEXT als Anwendungskontext verstanden werden.
Über einen Anwendungskontext lassen sich abhängig vom ausführenden System verschiedene Konfigurationswerte für eine Web-Applikation setzen.
Das wird benötigt, da eine moderne Web-Applikation auf verschiedenen Systemen entwickelt, getestet und bereitgestellt wird.
So sollen beispielsweise PHP-Fehlermeldungen auf einem Entwicklungssystem erscheinen, aber auf einem Produktivsystem
unterdrückt werden.

TYPO3 kennt die folgenden Hauptkontexte:

Development

für Entwicklungssysteme

Testing

für Testsysteme, z. B. funktionale Tests

Production

für Produktivsysteme, z. B. Live- oder Staging-Server

Weiterhin ist es auch möglich spezifischere Kontexte zu vergeben.
Hierfür kann ein Subkontext angegeben werden. Dieser muss mit einem Slash vom Hauptkontext getrennt werden.
Um beispielsweise ein Produktiv- und Stagingsystem zu trennen, können diese mit den Kontexten
Production/Live und Production/Staging bezeichnet werden.

TYPO3_CONTEXT

Beispiel für Systeme mit verschiedenen Kontexten

 

Konfiguration

Auf einem Linux-System kann der TYPO3_CONTEXT mittels des export Befehls global gesetzt werden:

export TYPO3_CONTEXT=Development

Außerdem ist es auch möglich den Kontext über den Web-Server zu setzen.
Über den Apache HTTP Server kann der Kontext beispielsweise über die Datei .htaccess oder die Virtual-Host-Konfiguration
gesetzt werden:

SetEnv TYPO3_CONTEXT Development

Das bringt eine gewisse Flexibilität mit sich, da man den Kontext für einzelne Verzeichnisse bzw. Webseiten statt nur
global definieren kann.

Abfrage via TypoScript

Der Kontext kann über TypoScript mittels der Condition applicationContext abgefragt werden:

# Einstellungen für Entwicklunssysteme
[applicationContext = Development]
  config.absRefPrefix = http://projekt.dev/
  config.admPanel = 1
  [...]
[end]

# Einstellungen für ein Stagingsystem
[applicationContext = Production/Staging]
  config.absRefPrefix = http://projekt.staging/
  [...]
[end]
# Einstellungen für ein Produktivsystem
[applicationContext = Production/Live]
  config.absRefPrefix = http://projekt.live/
  [...]
[end]

# Einstellungen für alle Produktivsysteme via Wildcard-Selector
[applicationContext = Production*]
  config.debug = 0
  [...]
[end]

# Einstellungen für eine Liste von Systemen
[applicationContext = Development/Debugging, Development/ClientA]
  [...]
[end]

Abfrage via PHP

Die Klasse \TYPO3\CMS\Core\Utility\GeneralUtility stellt statische Methoden zur Ermittlung des aktuellen Kontextes bereit.
Hauptkontexte können über die jeweiligen Funktionen getApplicationContext()->isDevelopment(),
getApplicationContext()->isTesting() und getApplicationContext()->isProduction() abgefragt werden.
Möchte man einen spezifischen Subkontext abfragen, kann man die Funktion getApplicationContext()->__toString() nutzen,
welche den kompletten Kontext als String zurückgibt.

Diese Funktionen können beispielsweise sinnvoll in der Datei typo3conf/AdditionalConfiguration.php genutzt werden:

<?php
if (!defined ('TYPO3_MODE')) {
    die ('Access denied.');
} 

/**
  * Development environment
  * TYPO3_CONTEXT Development
  */
if(\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->isDevelopment()) {
    $GLOBALS['TYPO3_CONF_VARS']['DB']['database'] = 'development-db';
    $GLOBALS['TYPO3_CONF_VARS']['DB']['username'] = 'development-db-user';
    $GLOBALS['TYPO3_CONF_VARS']['DB']['password'] = 'development-db-password';
    $GLOBALS['TYPO3_CONF_VARS']['DB']['host'] = '127.0.0.1';

    $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] = '[DEV] TYPO3 CMS';

    $GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'] = 'bacb98acf97e0b6112b1d1b650b84971';
}

/**
 * Staging environment
 * TYPO3_CONTEXT Production/Staging
 */
if(\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->isProduction()
   && \TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->__toString()
      === 'Production/Staging') {
    $GLOBALS['TYPO3_CONF_VARS']['DB']['database'] = 'staging-db';
    $GLOBALS['TYPO3_CONF_VARS']['DB']['username'] = 'staging-db-user';
    $GLOBALS['TYPO3_CONF_VARS']['DB']['password'] = 'staging-db-password';
    $GLOBALS['TYPO3_CONF_VARS']['DB']['host'] = '127.0.0.3';

    $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] = '[Staging] TYPO3 CMS';
}

[...]

Quellen:

Getagged mit:
Veröffentlicht unter TYPO3 Technik
7 Kommentare auf “TYPO3 Context verstehen und anwenden
  1. Christian sagt:

    Danke, sehr hilfreich!

  2. David sagt:

    Interessanter Artikel, danke! hab nirgends erklärende Infos dazu gefunden.

  3. ich schließe mich da mal nur an, und bedanke mich ebenfalls für diese hilfreiche information

  4. genau wonach ich gesucht habe, danke!

  5. Sehr intressant, sehr hilfreich, danke
    werde ich gleich mal auf unserem TYPO3-Testsystem konfigurieren.

  6. Michi sagt:

    Danke!

    Ich glaube, da ist diese Extension in den Core gewandert:
    https://github.com/b13/t3ext-environment

  7. Seit ein paar TYPO3 Versionen heißt die Variable z. B. $GLOBALS[„TYPO3_CONF_VARS“][„DB“][„Connections“][„Default“][„dbname“]. Ich hatte mich schon gewundert, warum es nicht auf Anhieb funktionierte 🙂 Danke!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*