Resources API
TYPO3 projects and extensions can reference two types of resource files:
Public resources that should be accessible with a browser, such as CSS and JavaScript files, images and downloads.
Private resources that are used by server-side code, such as templates, configuration files and localization files.
Table of contents
Location for resources in Composer-mode installations
By default, public resources must be put into the folder
Resources/ of an extension or somewhere within the web root
folder in Composer-based installations. Private resources should reside in
folder Resources/ or Configuration of an
extension or the folders config/ or config/.
Images and downloads may reside in folder public/ or custom
file storage.
Resources in classic mode installations
In TYPO3 classic mode, all files in extensions are already located within the document root. Restricting resources to default locations in classic mode therefore mainly follows coding guidelines and keeps compatibility with Composer mode.
Classic mode installations should use server side access restriction, for
example by using .htaccess or Nginx configurations. .htaccess can
be automatically tested and adjusted:
Verify webserver configuration (.htaccess).
Referencing private resources on the server side
The actual directory location where a file can be found varies from installation
to installation. It depends on the mode (Composer / Classic) and on certain
configuration, for example of the vendor folder. You should therefore avoid
using absolute or large relative paths like ../../../../.
The EXT: syntax: referencing resources in extensions
Most API functions in PHP and TypoScript expect files to reside in extensions
and accept a syntax such as EXT:.
They resolve the path internally. my_ is the extension key as defined in
extra.typo3/cms.extension-key
in the extension's composer., the rest is the relative path from that
extension's root folder.
Using API functionality to determine the path to a resource
In some rare cases you may need the absolute or relative path to a resource from within your code.
General offers utility method
General to resolve file paths:
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\Something;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class MyClass
{
public function myFunction(): void
{
$absoluteFilePath = GeneralUtility::getFileAbsFileName(
'EXT:my_extension/Resources/Private/SomeFile.xml',
);
}
}
The Environment PHP API
can be used to resolve paths to other locations within the project such as the
path to the config folder.
Resource identifiers: referencing files with EXT:, PKG:, FAL: and URLs
New in version 14.0 Feature: #107537 - System resource API for system file access and public URI generation
Where TYPO3 resolves a system resource, for example in the TypoScript
property
include, in the asset collector, in Fluid or
in the PHP API, it accepts these resource identifiers:
PKG:my- vendor/ my- extension: Resources/ Public/ Css/ main. css - A file in a package, identified by its Composer name. This works in
classic mode as well, if the extension has a
composer.. Thejson EXT:syntax can still be used for extensions. PKG:typo3/ app: public/ typo3temp/ assets/ style. css - A file of the project itself, with the virtual package name
typo3/and a path relative to the project root.app FAL:1:/ templates/ css/ main. css - A file in the file storage
with the UID
1. https://orexample. org/ css/ main. css URI:/css/ main. css - A URL, or a URL relative to the current host. An invalid URL throws an exception instead of ending up in the HTML.
Deprecated since version 14.0
Referencing a file by a path relative to the public folder, such as
typo3temp/ or _assets/, is deprecated.
A path such as fileadmin/ is only resolved in the default file
storage, which is configured in
$GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'].
Use one of the identifiers above instead.
Referencing public resources
Public resources such as JavaScript and CSS files are usually referenced using the Asset collector or f.assets.* ViewHelpers.
Public resources should not be referenced by their path in the _assets
folder as these paths contain a hash that might change during updates.
Fluid ViewHelper f:uri.resource
In Fluid you can use the Uri.resource ViewHelper <f:uri.resource> to reference resources. You can then provide the resource path in a data attribute:
<div
id="myMap"
data-icon="{f:uri.resource(extensionName: 'my_extension', path: 'Icons/Map/marker.svg')}"
data-addresses="{f:uri.resource(extensionName: 'my_extension', path: 'XML/addresses.xml')}"
></div>
The file paths can then be used within JavaScript:
const myMapElement= document.getElementById('myMap');
const addresses = myMapElement.dataset.addresses;
const iconPath = myMapElement.dataset.icon;
The ViewHelper f: accepts a resource identifier directly in its
path attribute (path="PKG:..."). Alternatively, an identifier can be
converted into a resource object using f:, for example when chaining
ViewHelpers:
<f:variable
name="addresses"
value="PKG:my-vendor/my-extension:Resources/Public/XML/addresses.xml"
/>
<div
id="myMap"
data-addresses="{addresses -> f:resource() -> f:uri.resource()}"
></div>
If the assets lie within the same extension you can also use relative paths in the JavaScript and CSS files.
Generating the URL of a public resource in PHP
New in version 14.0 Feature: #107537 - System resource API for system file access and public URI generation
To get the URL of a public resource in PHP, resolve its
resource identifier with the
\TYPO3\ and pass the
result to an implementation of
\TYPO3\.
It returns a URL that works in Composer and classic mode alike, with a cache
buster, because cache defaults to true:
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\Controller;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\SystemResource\Publishing\SystemResourcePublisherInterface;
use TYPO3\CMS\Core\SystemResource\Publishing\UriGenerationOptions;
use TYPO3\CMS\Core\SystemResource\SystemResourceFactory;
final readonly class MyMapController
{
public function __construct(
private SystemResourceFactory $systemResourceFactory,
private SystemResourcePublisherInterface $resourcePublisher,
) {}
public function getAddressesUrl(ServerRequestInterface $request): string
{
$resource = $this->systemResourceFactory->createPublicResource(
'PKG:my-vendor/my-extension:Resources/Public/XML/addresses.xml',
);
return (string)$this->resourcePublisher->generateUri(
$resource,
$request,
new UriGenerationOptions(absoluteUri: true),
);
}
}
Pass null as request only where there is no request, for example in a
console command. Absolute URLs cannot be generated then. To leave out the
cache buster, pass
new Uri.
create throws an exception if the resource is not
public, for example a Fluid template in Resources/. Use
create to resolve such a resource, for example to read it
on the server side.