Skip to content

Instantly share code, notes, and snippets.

@cedricziel
Last active October 27, 2021 08:12
Show Gist options
  • Save cedricziel/08ea469db5197e24552c to your computer and use it in GitHub Desktop.
Save cedricziel/08ea469db5197e24552c to your computer and use it in GitHub Desktop.
TYPO3 Extension with 3rd part composer dependencies. composer.json is placed in Resources/Private - Updated

Motivation

As long as composer support in CMS is "not there yet", you need to get around somehow.

Say you want to use the (awesome) markdown library, you need a way to get it in.

How

  1. Use a container extension with a private namespace
  2. Create composer.json
  3. Include the autoloader for both contexts
  4. profit

Why a separate composer.json?

Each extension gets a root composer.json sooner or later - but this one is irrelevant for now as we dont want to rely on the standard TYPO3 CMS classloader, but rather use the functionality offered by composer to create an autoloader for us.

For now, the package manager also awaited (TYPO3) packages to exist for every library you require.

Code

Note: You have to create all this in an extension. I put emphasis on the point that it should be a separate extension.

composer.json

Create a file composer.json in your container extension in Resources/Private (you can use composer init):

{
    "name": "cedricziel/packagename",
    "config": {
      "vendor-dir": "Libraries"
    },
    "require": {
        "michelf/php-markdown": "~1.4"
    },
    "authors": [
        {
            "name": "Cedric Ziel",
            "email": "cedric @t cedric-ziel.com"
        }
    ]
}

Note the vendor-dir directive. This allows you to determine where composer will put the libs and the class loader you have to include.

ext_tables.php && ext_localconf.php

I cant explain the exact sematics very well, but you will want to have both. Otherwise your classes wont load in a cached context.

ext_tables.php

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

$composerAutoloadFile = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($_EXTKEY)
	. 'Resources/Private/Libraries/autoload.php';

require_once($composerAutoloadFile);

ext_localconf.php

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

$composerAutoloadFile = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($_EXTKEY)
	. 'Resources/Private/Libraries/autoload.php';

require_once($composerAutoloadFile);

Notes

This is a workaround - let me get this straight. Problems could arise if you do that overly often with many different libraries and end up with different loadable versions. I therefore propose you creat one such container extension per project.

Edit

@madsbrunn
Copy link

As far as I know ext_localconf.php are always loaded so it should only be nescessary to require the autoload file there (please correct me if I'm wrong).

@cedricziel
Copy link
Author

Added an example extension that uses a composer script to package the library https://github.com/cedricziel/typo3-ext-slugify

@AlexeyFreelancer
Copy link

@cedricziel Should I manually execute composer install and commit Libraries folder into repository?

@Romaixn
Copy link

Romaixn commented Apr 27, 2021

This gist is up-to-date in 2021 ? (or Composer has been included..)

EDIT: This gist work in 2021, thanks ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment