Überschreiben von Klassen in Extbase

Kürzlich wurde ich von jemandem gefragt, wo denn die XClasses bei Extbase und Fluid geblieben seien.

Die XClasses sind bei konsequenter Verwendung des ObjectManager zur Instanziierung von Klassen nicht mehr unbedingt notwendig.

Zur Anschauung folgendes Beispiel:
Die PID zur Speicherung neuer Datensätze wird in der Methode determineStoragePageIdForNewRecord der Klasse Tx_Extbase_Persistence_Backend ermittelt.
Bis Version 1.4 von extbase (wenn ich mich nicht täusche) wurde in dieser Methode nicht abgefragt, ob dem zu speichernden Objekt nicht möglicherweise eine PID manuell zugewiesen wurde.
Da dies aber unter Umständen sinnvoll sein kann, stellt sich die Frage, wie kann ich diese Methode der Klasse „überschreiben“, ohne extbase zu „hacken“?
Eine klassiches TYPO3-XClassing ist ja nicht möglich. Was also tun?

Wenn man sich einmal die in extbase vorhandene TypoScript-Konfiguration ansieht, stößt einem schnell die Konfigurationsdirektive:

config.tx_extbase {
   objects {
      Tx_Extbase_Persistence_Storage_BackendInterface {
         className = Tx_Extbase_Persistence_Storage_Typo3DbBackend
   }
}

auf.

Dies führt dazu, dass alle Injections die mit dem Type-Hinting Tx_Extbase_Persistence_Storage_BackendInterface versehen sind, die Klasse Tx_Extbase_Persistence_Storage_Typo3DbBackend instanziieren.

Um dies auf das beschriebene Beispiel von oben zu übertragen, müssen wir demnach folgende Konfiguration in unser TS aufnehmen:

config.tx_extbase {
    objects {
        Tx_Extbase_Persistence_BackendInterface {
            className = Tx_MyExt_Persistence_Backend
        }
    }
}

In diesem unserem Backend überschreiben wir nun die Methode determineStoragePageIdForNewRecord:

class Tx_MyExt_Persistence_Backend extends Tx_Extbase_Persistence_Backend {

    /**
     * Determine the storage page ID for a given NEW record
     *
     * This does the following:
     * - If there is a TypoScript configuration "classes.CLASSNAME.newRecordStoragePid", that is used to store new records.
     * - If there is no such TypoScript configuration, it uses the first value of The "storagePid" taken for reading records.
     *
     * @param Tx_Extbase_DomainObject_DomainObjectInterface $object
     * @return int the storage Page ID where the object should be stored
     */
    protected function determineStoragePageIdForNewRecord(Tx_Extbase_DomainObject_DomainObjectInterface $object = NULL) {

        if ($object !== NULL && Tx_Extbase_Reflection_ObjectAccess::isPropertyGettable($object, 'pid')) {
            $pid = $object->getPid();
            if (t3lib_div::testInt($pid)) {
                return $pid;
            }

            return parent::determineStoragePageIdForNewRecord($object);
        }
    }

}

Ein weiterer nützlicher Anwendungsfall könnte das Überschreiben der konkreten ConfigurationManager sein.
Um dieses Ziel zu erreichen, müsstest man folgendermaßen Vorgehen:

TS-Konfiguration

config.tx_extbase {
    objects {
        Tx_Extbase_Configuration_ConfigurationManager {
           className = Tx_MyExt_Configuration_ConfigurationManager
        }
     }
}

ConfigurationManager

class Tx_MyExt_Configuration_ConfigurationManager extends Tx_Extbase_Configuration_ConfigurationManager {

    /**
     * @return void
     */
    protected function initializeConcreteConfigurationManager() {
        if (TYPO3_MODE === 'FE') {
            $this->concreteConfigurationManager = $this->objectManager->get('Tx_MyExt_Configuration_FrontendConfigurationManager');
        } else {
            $this->concreteConfigurationManager = $this->objectManager->get('Tx_Extbase_Configuration_BackendConfigurationManager');
        }
    }
}

Konkrete Implementierung abhängig vom aktuellen TYPO3_MODE

class Tx_MyExt_Configuration_FrontendConfigurationManager extends Tx_Extbase_Configuration_FrontendConfigurationManager {
  
  /**
   * Overrides configuration settings from flexforms.
	 * This merges the whole flexform data, and overrides switchable controller actions.
	 *
	 * @param array the framework configuration
	 * @return array the framework configuration with overridden data from flexform
	 */
  protected function overrideConfigurationFromFlexform(array $frameworkConfiguration) {
        // Do What you want
        parent::overrideConfigurationFromFlexform($frameworkConfiguration);
    }
}

Schöne neue Welt.

Ich hoffe, ich habe dies alles einigermaßen korrekt und verständlich geschrieben.

Veröffentlicht von

avatar

Sebastian Schreiber

Ich bin 1980 in Bergisch Gladbach geboren. Nach dem Abitur und Zivildienst habe ich 2000 an der Fachhochschule Lippe & Höxter das Studium der Medienproduktin begonnen und nach längeren Aufenthalten in Valencia und Berlin 2003 das Studium mit dem Abschluss Bachelor of Science in Medienproduktion abgeschlossen. Nach einer Festanstellung kurz nach dem Studium in einer kleinen Webagentur in Köln mit Schwerpunkt TYPO3 bin ich nun seit 2008 freiberuflicher Webentwickler.

Ein Gedanke zu „Überschreiben von Klassen in Extbase“

  1. Hi Sebastian,
    danke für die hilfreiche Erklärung.
    Mittlerweile haben sich die Benennungen der Klassen wieder geändert. In deiner TS Konfiguration für Tx_Extbase_Configuration_ConfigurationManager fehlt „objects“.
    Gruß Sven

Schreibe einen Kommentar

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