typo3/class-alias-loader
Composer plugin that adds a class alias autoloader for backward compatibility when libraries rename classes. Packages provide PHP alias map files; on autoload dump it amends vendor/autoload.php and transparently class_alias() old names to new ones.
Install the Package:
composer require typo3/class-alias-loader
Add to your root composer.json under extra:
"extra": {
"typo3/class-alias-loader": {
"class-alias-maps": [
"path/to/YourAliasMap.php"
]
}
}
Create an Alias Map:
Define a PHP file (e.g., app/Compatibility/LaravelAliasMap.php) returning an associative array:
return [
'Old\Deprecated\Class' => 'App\\New\\Class',
'Illuminate\Support\Facades\Input' => 'Illuminate\Http\Request',
];
Trigger Autoload Update:
composer dump-autoload
The package hooks into Composer’s autoloader and injects class_alias() calls for old class names.
Verify: Test by requiring an old class name:
$oldClass = new Old\Deprecated\Class(); // Transparently loads App\New\Class
Laravel Facade Migration:
Replace deprecated Laravel 8 Facades (e.g., Input, Cache) with their Laravel 11 equivalents without rewriting legacy code:
// composer.json
"extra": {
"typo3/class-alias-loader": {
"class-alias-maps": ["app/Compatibility/LaravelFacades.php"]
}
}
// app/Compatibility/LaravelFacades.php
return [
'Illuminate\Support\Facades\Input' => 'Illuminate\Http\RequestFacade',
'Illuminate\Support\Facades\Cache' => 'Illuminate\Cache\Facades\Cache',
];
Static Alias Resolution (Recommended)
composer.json and let the loader handle them during composer dump-autoload."extra": {
"typo3/class-alias-loader": {
"class-alias-maps": [
"vendor/package/alias-map.php",
"app/Compatibility/CustomAliases.php"
]
}
}
Dynamic Runtime Aliases
always-add-alias-loader: true to ensure the loader runs even without maps.use TYPO3\ClassAliasLoader\ClassAliasMap;
ClassAliasMap::addClassAliasMap([
'Dynamic\OldClass' => 'App\\Dynamic\\NewClass',
]);
API-Driven Resolution
ClassAliasMap::getClassNameForAlias() to resolve aliases in strings (e.g., configuration, logs):
$newClass = ClassAliasMap::getClassNameForAlias('Old\Class');
if ($newClass !== 'Old\Class') {
// Use $newClass instead
}
Third-Party Library Integration
composer.json:
"extra": {
"typo3/class-alias-loader": {
"class-alias-maps": ["vendor/your-package/aliases.php"]
}
}
tx_* → TYPO3\CMS\*).Laravel-Specific:
AppServiceProvider for Facade overrides:
public function register()
{
if (class_exists('Old\Facade\Class')) {
\Facade\IgnoreFacadeRerebinding::ignore('Old\Facade\Class');
\Facade\Facade::alias('Old\Facade\Class', 'App\\New\\Facade');
}
}
Old\Helper\Functions → App\Helpers\Utils).Performance:
Testing:
class_alias() in PHPUnit to test alias behavior:
$this->getMockBuilder('TYPO3\ClassAliasLoader\ClassAliasLoader')
->disableOriginalConstructor()
->onlyMethods(['register'])
->getMock();
CI/CD:
composer dump-autoload in your pipeline to ensure aliases are up-to-date.always-add-alias-loader: true to catch missing maps early.Autoload Conflicts:
vendor/autoload.php. If your project uses custom autoloaders (e.g., autoload_dev.php), conflicts may arise.composer dump-autoload --verbose.Case Sensitivity:
old\class vs. Old\Class, aliases won’t resolve.Facade Breakage:
AppServiceProvider. Example:
// ❌ Won’t work:
$input = new Illuminate\Support\Facades\Input; // Uses alias, but Facade::swap() is bypassed.
// ✅ Workaround:
\Facade\Facade::alias('Input', 'Illuminate\Http\RequestFacade');
Facade::alias() for Facades; reserve the loader for non-Facade classes.Circular Dependencies:
A => B, B => A) cause infinite loops.$map = require 'path/to/alias-map.php';
$this->assertNoCircularReferences($map);
Opcache Invalidation:
opcache_reset() in your deployment script.PHP Version Mismatch:
composer.json:
"require": {
"typo3/class-alias-loader": "1.2.2"
}
Composer Plugin Conflicts:
composer/pcre) may interfere with autoload generation.composer diagnose to check for conflicts. Isolate the loader by testing in a clean vendor/ directory.Verify Alias Injection:
vendor/autoload.php for class_alias() calls after composer dump-autoload.class_alias(\Old\Class::class, \New\Class::class, true);
Log Missing Aliases:
register() method to log unresolved classes:
\TYPO3\ClassAliasLoader\ClassAliasLoader::register();
// Add logging before/after registration.
Test Alias Resolution:
function debugAlias(string $class): void
{
if (class_alias($class, $class, true)) {
echo "Alias for {$class} exists.\n";
} else {
echo "No alias found for {$class}.\n";
}
}
Check for Duplicates:
A => B and A => C) cause class_alias() to fail silently.$map = require 'path/to/alias-map.php';
$this->assertCount(count(array_unique($map)), $map);
TYPO3\ClassAliasLoader\ClassAliasLoader:
class CustomAliasLoader extends \TYPO3\ClassAliasLoader\ClassAliasLoader
{
public
How can I help you explore Laravel packages today?