Skip to content

Instantly share code, notes, and snippets.

@samir-plusb
Forked from cedricziel/README.md
Created June 2, 2020 16:42
Show Gist options
  • Save samir-plusb/1c895d720b811ab10ec379db3efc547e to your computer and use it in GitHub Desktop.
Save samir-plusb/1c895d720b811ab10ec379db3efc547e 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

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