TYPO3 Extensions und Namespaces
Wie nutze ich Namespaces in meiner TYPO3-Extension?
Um es vorweg zu sagen: Die dramatischsten Codeänderungen, sind zum jetzigen Zeitpunkt gerade einmal 2 Wochen her und das Core Team ist noch ziemlich beschäftigt einige Fehler zu beseitigen, die sich mit der Umstellung eingeschlichen haben. So weit ich das beurteilen kann, geht das schon in eine gute Richtung, aber es ist noch nicht ausgeschlossen, dass sich bis zum Release von TYPO3 6.0 noch grundlegende Dinge an der Klassenstruktur ändern oder die ganze Migration wieder rückgängig gemacht wird.
Der aktuelle Stand ist, dass alle Klassen des Core in System Extensions ausgelagert wurden und unter dem Namespace \TYPO3\CMS\ExtensionName geführt werden, wobei der ExtensionName, die UpperCamelCase-Variante des Extension-Keys sein muss. Die Klasse CssStyledContentController in typo3/sysext/css_styled_content/Classes/Controller/CssStyledContentController.php liegt also im Namespace \TYPO3\CMS\CssStyledContent\Controller.
Für alle übrigen Extensions gilt, dass der Namespace \Vendor\ExtensionName sein muss. Der Vendor-Namespace bezieht sich auf den Herausgeber der Software und kann sich beispielsweise aus dem Namen des Entwicklers, einem github-Account oder einem Firmen- oder Organisationsnamen ableiten.
Beispiel: Der ProductController, der in EXT:my_shop/Classes/Controller/ProductController.php untergebracht ist, liegt also im Namespace \MyCompany\MyShop\Controller.
Der Autoloader löst die mit Namespaces versehenen Klassennamen wie folgt auf:
- Beginnt der Namespace mit \TYPO3\CMS ist das dritte Segment der ExtensionName
- Andernfalls ist das zweite Segment der ExtensionName
- Aus dem ExtensionName lässt sich der Extension Key und damit der Pfad zur Extension ableiten
- Die restlichen Namespace-Segmente geben die Ordnerstruktur (innerhalb des Classes-Ordner der Extension) wieder
Hinweis: Das Autoloading funktioniert zwar technisch, wenn man in einer eigenen Extension den \TYPO3\CMS Namespace verwendet, aber dieser Namespace ist wirklich nur für den Core gedacht. Für eigene Extensions sollte auf jeden Fall die Variante mit dem Vendor-Namespace genutzt werden.
Bildnachweis: 214-366 Colorful Order von cheesy42 (CC BY-NC-ND 2.0)