Die Umstellung eines TYPO3-Projekts auf Composer verändert nicht nur die Art, wie Erweiterungen installiert werden. Sie verändert auch, wie öffentliche Erweiterungsressourcen wie CSS, JavaScript, Bilder und Schriftarten für das Web bereitgestellt werden.
Wenn Ihr Projekt noch fest kodierte Pfade wie diese enthält:
/typo3conf/ext/site_package/Resources/Public/...
sollten Sie diese bei der Migration zu einer modernen Composer-basierten TYPO3-Installation überprüfen.
Im Composer-Modus werden TYPO3-Extensions außerhalb der öffentlichen Web-Root installiert. Ihre öffentlichen Ressourcen werden über public/_assets/ bereitgestellt, während Dateien wie PHP-Klassen, Konfigurationen und Vorlagen vor direktem HTTP-Zugriff geschützt bleiben.
TYPO3 v12 erfordert typo3/cms-composer-installers v5, wodurch diese Struktur Teil der standardmäßigen Composer-Installation wird.
Die gute Nachricht: Normalerweise sollten Sie alte URLs nicht durch fest kodierte _assets-URLs ersetzen. Verwenden Sie stattdessen die Ressourcen-APIs von TYPO3, EXT:-Verweise, relative Pfade oder Ihr Frontend-Build-System.
Diese Anleitung zeigt Ihnen genau, wie die Migration funktioniert.
Was ist _assets in TYPO3?
public/_assets/ enthält Symlinks zu den Resources/Public/-Verzeichnissen von per Composer installierten TYPO3 extensions.
Zum Beispiel:
packages/site_package/
└── Resources/
└── Public/
├── Css/
├── JavaScript/
├── Images/
└── Fonts/
Composer/TYPO3 stellt diese öffentlichen Ressourcen über Folgendes bereit:
public/_assets/<generated-hash>/
Der Hash hilft dabei, den Namen der Erweiterung und den Composer-Pfad nicht offenzulegen. Der genaue Hash-Mechanismus ist jedoch ein Implementierungsdetail und kann sich in zukünftigen TYPO3-Major-Versionen ändern.
Daher: Erstellen Sie Ihre Anwendung nicht mit einer hart codierten URL _assets/<hash>/....
Warum hat TYPO3 von typo3conf/ext zu _assets gewechselt?
Der Hauptgrund ist Sicherheit und eine sauberere Composer-Architektur.
In älteren Installationen konnte eine Erweiterung direkt unter folgendem Pfad erreichbar sein:
public/typo3conf/ext/
Das bedeutete, dass der Webserver potenziell Dateien ausliefern konnte, die nie für die Öffentlichkeit bestimmt waren.
Moderne Composer-Installationen platzieren Erweiterungspakete außerhalb des öffentlichen Webroots, typischerweise unter vendor/ oder einem lokalen packages/-Verzeichnis. Nur das Verzeichnis Resources/Public/ der Erweiterung wird für den Browser freigegeben.
Die grundlegende Architektur sieht nun so aus:
Composer-Erweiterung
│
├── PHP
├── Konfiguration
├── Templates
└── Resources/Public
│
▼
public/_assets/
Dadurch entsteht eine deutlich bessere Trennung zwischen Anwendungscode und öffentlichen Assets.
typo3conf/ext vs. Composer _assets
| Älterer Ansatz | Composer-basiertes TYPO3 |
| public/typo3conf/ext/ | vendor/ oder packages/ |
| Erweiterungscode öffentlich abgelegt | Erweiterungscode außerhalb des Webroots |
| Assets direkt referenziert | Öffentliche Assets über _assets bereitgestellt |
| Hart codierte Erweiterungspfade üblich | TYPO3-Resource-APIs bevorzugt |
| Höheres Risiko, interne Dateien offenzulegen | Bessere Trennung von öffentlich und privat |
Die aktuelle Dokumentation zur Verzeichnisstruktur von TYPO3 bestätigt, dass public/_assets/ Symlinks zu den Erweiterungsverzeichnissen Resources/Public/ enthält und dass typo3conf/ext/ in modernen Composer-Projekten nicht mehr verwendet wird.
Schritt 1: Alte Verweise auf typo3conf/ext finden
Bevor Sie Code ändern, durchsuchen Sie Ihr gesamtes Projekt nach:
typo3conf/ext/
Prüfen Sie:
- Fluid-Templates
- CSS
- SCSS
- JavaScript
- TypeScript
- PHP
- TypoScript
- TSconfig
- RTE-Konfiguration
- YAML
- JSON
- Frontend-Build-Konfiguration
- eigene Skripte
TYPO3 selbst empfiehlt, den Erweiterungscode während der Migration nach alten typo3conf/ext/-Verweisen zu durchsuchen.
Eine einfache projektweite Suche kann die meisten Migrationskandidaten aufdecken:
grep -R "typo3conf/ext/" .
Ihr Ziel ist es nicht, jede Vorkommnis blind zu ersetzen. Ermitteln Sie zuerst, um welche Art von Pfad es sich handelt.
Schritt 2: Öffentliche Assets in Resources/Public belassen
Öffentliche Erweiterungs-Assets sollten sich innerhalb von Folgendem befinden:
Resources/Public/
Typische Struktur:
Resources/Public/
├── Css/
├── JavaScript/
├── Images/
├── Fonts/
└── Icons/
TYPO3 definiert Resources/Public ausdrücklich für Dateien, die vom Webserver ausgeliefert werden sollen, wie CSS, JavaScript, Bilder und Schriftarten.
Private Ressourcen wie Templates, Konfiguration und Lokalisierungsdateien sollten privat bleiben.
CSS-Asset-Pfade migrieren
Eines der häufigsten Migrationsprobleme ist eine hart codierte CSS-URL.
Alter Ansatz
.CssClass {
background-image: url("/typo3conf/ext/site_package/Resources/Public/Images/TheImage.jpeg");
}
Dieser Pfad funktioniert nicht korrekt, sobald die Erweiterung über die moderne Composer-Struktur installiert wird.
Beste Option: relative Pfade verwenden
Wenn CSS und Bild zur gleichen Erweiterung gehören, verwenden Sie eine relative URL:
.CssClass {
background-image: url("../Images/TheImage.jpeg");
}
Dies ist der bevorzugte Ansatz für Ressourcen innerhalb derselben Erweiterung. Die TYPO3-Migrationsdokumentation empfiehlt für diesen Fall ausdrücklich relative Links.
Dies vermeiden
background-image: url("/_assets/<hash>/Images/TheImage.jpeg");
Auch wenn eine gehashte _assets-URL funktionieren kann, koppelt sie Ihr CSS an das interne Asset-Mapping von TYPO3.
Was ist, wenn CSS ein Asset aus einer anderen Erweiterung referenziert?
Das ist ein komplexerer Fall.
Zum Beispiel:
Erweiterung A
└── Resources/Public/Css/style.css
Erweiterung B
└── Resources/Public/Images/logo.svg
CSS kann TYPO3s EXT:-Syntax im Browser nicht direkt und bequem verwenden.
Bessere Optionen sind unter anderem:
- Gemeinsam genutzte Assets in einem zentralen Sitepackage bündeln.
- Einen Frontend-Asset-Bundler wie Vite, webpack, Gulp oder Encore verwenden.
- Die Asset-URL über Fluid, PHP oder TypoScript erzeugen und an das Frontend übergeben.
- Eine dedizierte Route oder PSR-15-Middleware für spezielle dynamische Asset-Anforderungen verwenden.
TYPO3 empfiehlt, gemeinsam genutzte Assets zu zentralisieren oder bei Bedarf einen Bundler zu verwenden.
JavaScript-Asset-Pfade migrieren
JavaScript enthält oft versteckte Asset-Abhängigkeiten.
Zum Beispiel kann eine Kartenbibliothek Folgendes enthalten:
const icon = L.icon({
iconUrl: '/typo3conf/ext/site_package/Resources/Public/Icons/Map/marker.svg',
shadowUrl: '/typo3conf/ext/site_package/Resources/Public/Icons/Map/shadow.svg'
});
Anstatt den alten Pfad hart zu codieren, lassen Sie TYPO3 die Ressource auflösen.
Empfohlener Ansatz: URLs über HTML übergeben
In Fluid:
<div
id="map"
data-icon="{f:uri.resource(path: 'Icons/Map/marker.svg')}"
data-shadow="{f:uri.resource(path: 'Icons/Map/shadow.svg')}"
></div>
Dann kann JavaScript die generierten URLs verwenden:
const mapElement = document.getElementById('map');
const icon = L.icon({
iconUrl: mapElement.dataset.icon,
shadowUrl: mapElement.dataset.shadow
});
Dieser Ansatz hält die TYPO3-spezifische Pfadauflösung in TYPO3 und macht Ihr JavaScript unabhängig von _assets.
Die aktuelle Resources-API von TYPO3 empfiehlt diese Art der Ressourcenauflösung anstelle direkter Verweise auf _assets.
Fluid-Templates migrieren
Fluid-Templates sollten TYPO3s Ressourcenbehandlung anstelle hart codierter typo3conf/ext-URLs verwenden.
Alt
<img src="/typo3conf/ext/site_package/Resources/Public/Images/logo.svg" alt="Logo">
Empfohlen
<img
src="{f:uri.resource(path: 'Images/logo.svg')}"
alt="Logo"
>
Zum Beispiel für einen SVG-Sprite:
<svg>
<use href="{f:uri.resource(path: 'Images/icons.svg')}#symbol"></use>
</svg>
Sie können bei Bedarf auch explizit eine Erweiterung mit EXT: referenzieren:
{f:uri.resource(
path: 'EXT:site_package/Resources/Public/Images/logo.svg'
)}
Die Resources-API von TYPO3 identifiziert f:uri.resource als den Standard-Mechanismus in Fluid zur Auflösung öffentlicher Erweiterungsressourcen.
Best Practice
Lassen Sie Fluid/TYPO3 die öffentliche URL erzeugen.
Versuchen Sie nicht, den _assets-Hash selbst zu berechnen.
PHP-Asset-Referenzen migrieren
PHP kann entweder einen Dateisystempfad oder eine öffentliche Web-URL benötigen. Das sind zwei verschiedene Dinge.
Für einen serverseitigen Dateipfad TYPO3 unterstützt die EXT:-Syntax mit seinen Resource/Path-APIs:
$absoluteFilePath = GeneralUtility::getFileAbsFileName(
'EXT:site_package/Resources/Public/Images/logo.png'
);
Für eine öffentliche URL verwenden Sie eine API, die für die Auflösung eines Webpfads gedacht ist, statt manuell zusammenzuketten:
TYPO3_SITE_URL + /_assets/<hash>/...
Die aktuelle Resources-API von TYPO3 unterscheidet ausdrücklich zwischen serverseitigen Ressourcenpfaden und öffentlichen Ressourcen-URLs.
Merken Sie sich
Dateisystempfad ≠ öffentliche URL
Diese Unterscheidung verhindert viele Composer-Migrationsfehler.
TypoScript-Asset-Referenzen migrieren
TypoScript enthält häufig Verweise auf CSS, JavaScript, Schriftarten und Bilder.
Verwenden Sie EXT:-Verweise statt des alten Dateisystempfads.
Zum Beispiel:
page.meta {
og:image.cObject = TEXT
og:image.cObject {
typolink {
parameter.cObject = IMG_RESOURCE
parameter.cObject.file =
EXT:site_package/Resources/Public/Images/opengraph.png
returnLast = url
forceAbsoluteUrl = 1
}
}
}
Dasselbe Prinzip gilt beim Definieren von Ressourcen wie Schriftarten oder anderen öffentlichen Assets.
Die TYPO3-Migrationsdokumentation empfiehlt die Notation EXT:my_extension/Resources/Public/..., wo sie unterstützt wird.
TSconfig migrieren
Alte TSconfig-Verweise können so aussehen:
<INCLUDE_TYPOSCRIPT: source="FILE:typo3conf/ext/site/Configuration/TSconfig/User/name.tsconfig">
Verwenden Sie stattdessen die erweiterungsbewusste Syntax:
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:site_package/Configuration/TSconfig/User/name.tsconfig">
Dadurch entfällt die Abhängigkeit vom alten typo3conf/ext-Speicherort.
RTE-Konfiguration migrieren
Die RTE-Konfiguration ist ein weiterer leicht zu übersehender Ort.
Alt
editor:
config:
contentCss: '/typo3conf/ext/site_package/Resources/Public/Css/rte.css'
Empfohlen
editor:
config:
contentCss: 'EXT:site_package/Resources/Public/Css/rte.css'
Wenn Sie ein TYPO3-Projekt migrieren, nehmen Sie die RTE-Konfiguration in Ihre projektweite Suche nach typo3conf/ext auf.
Was ist mit statischen Dateien?
Nicht jede Datei gehört in Resources/Public.
Wenn eine Datei direkt unterhalb des öffentlichen Webroots eine vorhersehbare URL benötigt, etwa eine statische Ressource auf Projektebene, benötigen Sie möglicherweise ein dediziertes öffentliches Verzeichnis oder einen anderen TYPO3-Mechanismus.
Für dynamische Inhalte sollten Sie Folgendes in Betracht ziehen:
- PSR-15-Middleware
- dynamische Routen
- einen dedizierten öffentlichen Endpunkt
- ein öffentliches Verzeichnis auf Projektebene
Die TYPO3-Migrationsdokumentation empfiehlt ausdrücklich dynamische Routen, Middleware oder benutzerdefinierte öffentliche Verzeichnisse für statische Links, die nicht den normalen Mechanismus für Erweiterungsressourcen verwenden können.
Denken Sie außerdem daran:
Platzieren Sie zur Laufzeit erzeugte Dateien nicht in Resources/Public.
Dieses Verzeichnis ist für statische Erweiterungs-Assets vorgesehen.
Verwalten Sie public/_assets nicht manuell
Dies ist eine der wichtigsten Regeln.
Das Verzeichnis _assets wird im Rahmen des Composer/TYPO3-Setups generiert und verwaltet.
Tun Sie Folgendes nicht:
- seine Verzeichnisse manuell umbenennen
- seine Symlinks manuell ersetzen
- Inhalte von
_assetsfür die Produktion als normale Dateien einchecken - die Anwendungslogik auf den generierten Hash aufbauen
TYPO3 empfiehlt, dass _assets reproduzierbar bleibt und seine Symlinks über Composer neu erstellt werden können. Ein composer dumpautoload kann fehlende Public-Asset-Links nach dem Hinzufügen von Ressourcen neu erzeugen.
Wie finde ich die _assets-URL?
Wenn Sie das generierte Asset-Mapping wirklich prüfen müssen, bietet TYPO3 Console:
vendor/bin/typo3 frontend:asseturl
Dies kann helfen, den Hash des öffentlichen Ressourcenverzeichnisses für installierte Erweiterungen zu ermitteln.
Verwenden Sie dies jedoch vor allem für Debugging oder Sonderfälle und nicht als normale Strategie für Asset-Verweise. TYPO3 empfiehlt, direkte _assets-Verweise zu vermeiden, weil der Hash-Mechanismus ein Implementierungsdetail ist.
TYPO3 _assets-Migrations-Checkliste
Bevor Sie Ihre Migration abschließen, prüfen Sie:
- Das gesamte Projekt nach
typo3conf/ext/durchsuchen. - Öffentliche Erweiterungs-Assets in
Resources/Public/verschieben. - Hart codierte Fluid-URLs durch
f:uri.resourceersetzen. - In TypoScript und unterstützten Konfigurationen
EXT:-Verweise verwenden. - Alte CSS-Pfade durch relative URLs ersetzen, wenn die Assets zur gleichen Erweiterung gehören.
- TYPO3-generierte URLs bei Bedarf über Data-Attribute an JavaScript übergeben.
- PHP-Dateisystempfade getrennt von öffentlichen URLs prüfen.
- TSconfig- und RTE-Konfiguration prüfen.
- Frontend-Build-Pipelines überprüfen.
- Vermeiden Sie die feste Einbindung von
_assets/<hash>/. - Symlinks in
_assetsnicht manuell verwalten. - Bei Bedarf
composer dump-autoloadausführen. - Caches leeren und das Frontend testen.
- CSS, JavaScript, Bilder, Schriftarten, SVGs und Downloads testen.
- Die Produktionsbereitstellung mit einer sauberen Composer-Installation testen.
Häufige TYPO3 _assets-Migrationsfehler
Jeden alten Pfad durch _assets ersetzen
Wandeln Sie nicht einfach:
/typo3conf/ext/site/Resources/Public/logo.svg
in:
/_assets/<hash>/logo.svg
Den Hash selbst berechnen
Der Hash ist ein Implementierungsdetail.
Dateisystempfade als Browser-URLs verwenden
Ein serverseitiger Pfad und eine öffentliche URL sind nicht austauschbar.
Frontend-Build-Tools vergessen
Webpack, Vite, Encore, Gulp und ähnliche Pipelines können weiterhin alte Ausgabepfade enthalten.
_assets manuell bearbeiten
Lassen Sie Composer/TYPO3 die Symlinks erstellen.
Fazit
Der Wechsel von typo3conf/ext zu Composer-basiertem Erweiterungs-Handling ist mehr als nur eine Pfadänderung. Es ist ein Schritt hin zu einer saubereren Trennung zwischen privatem Erweiterungscode und öffentlichen Web-Assets.
Die wichtigste Regel ist einfach:
Migrieren Sie alte Pfade nicht, indem Sie _assets-URLs hart codieren. Migrieren Sie die Art und Weise, wie Ihre Anwendung Assets referenziert.
Verwenden Sie:
Resources/Public/für statische öffentliche Erweiterungs-Assetsf:uri.resourcein FluidEXT:-Notation, wo unterstützt- relative Pfade für Assets innerhalb derselben Erweiterung
- TYPO3-Resource-APIs für PHP
- Data-Attribute für JavaScript, wenn URLs in Frontend-Code übergeben werden müssen
- eine zentrale Asset-Strategie oder einen Bundler für gemeinsam genutzte Assets
Wenn diese Muster einmal umgesetzt sind, wird Ihr TYPO3-Projekt sicherer, Composer-freundlicher und über zukünftige TYPO3-Upgrades hinweg leichter zu warten sein.
FAQs
public/_assets/ enthält Symlinks zu den Resources/Public-Verzeichnissen von über Composer installierten Extensions. Dadurch können öffentliche Assets bereitgestellt werden, ohne den vollständigen Extension-Code offenzulegen.
Moderne Composer-basierte TYPO3-Installationen platzieren Extensions außerhalb des öffentlichen Web-Roots. Dies verbessert die Sicherheit, da nur Ressourcen öffentlich zugänglich gemacht werden, die für die öffentliche Bereitstellung vorgesehen sind.
Im Allgemeinen nein. Verwenden Sie stattdessen die Ressourcen-APIs von TYPO3, die EXT:-Notation, relative URLs oder Ihr Frontend-Build-System.
Für Extensions sollten statische öffentliche Ressourcen hier abgelegt werden:
Resources/Public/
Typische Unterverzeichnisse sind Css, JavaScript, Images und Fonts.
Durchsuchen Sie Ihr Projekt nach typo3conf/ext/ und migrieren Sie anschließend jede Referenz entsprechend ihrem jeweiligen Kontext: Fluid, CSS, JavaScript, PHP, TypoScript, TSconfig, RTE oder Frontend-Build-Konfiguration.
Wolfgang Weber
Brand & Communication LeadWolfgang Weber gestaltet TYPO3 mit Leidenschaft und Fachwissen. Als TYPO3-Enthusiast beim T3Planet Shop hat er an TYPO3-Projekten mitgewirkt, die Websites schneller und sicherer machen. Abseits von TYPO3 findet man ihn wahrscheinlich beim Erkunden lokaler Cafés oder beim Fußball.
More From Author