laminas/laminas-loader
Abandoned Laminas component that provided autoloading and plugin loading utilities for PHP applications. No further development is planned; check Laminas TSC minutes for details and consider migrating to supported alternatives.
Installation:
Add the package to your composer.json under "require":
composer require laminas/laminas-loader:^2.12
Run composer dump-autoload to generate the autoloader.
First Use Case:
Use the ClassMapAutoloader for static class mapping or AutoloaderFactory for dynamic PSR-4 autoloading:
use Laminas\Loader\ClassMapAutoloader;
$loader = new ClassMapAutoloader([
'App\LegacyClass' => __DIR__ . '/legacy/LegacyClass.php',
]);
$loader->register();
Where to Look First:
src/ directory in the package for core classes (ClassMapAutoloader, AutoloaderFactory, PluginClassLoader).bootstrap/app.php or composer.json for integration points.Static Class Mapping:
Use ClassMapAutoloader for classes not following PSR-4 (e.g., legacy code):
$loader = new ClassMapAutoloader([
'Vendor\Legacy\Class' => __DIR__ . '/path/to/Class.php',
]);
$loader->register();
PSR-4 Autoloading:
Leverage AutoloaderFactory for dynamic PSR-4 loading (similar to Composer):
use Laminas\Loader\AutoloaderFactory;
$factory = new AutoloaderFactory();
$autoloader = $factory->createAutoloader([
'App\\' => __DIR__ . '/app/',
]);
$autoloader->register();
Plugin Loading:
Use PluginClassLoader for loading plugins dynamically (e.g., service providers):
$pluginLoader = new PluginClassLoader();
$pluginLoader->addNamespace('App\Plugins');
$pluginLoader->register();
Laravel Integration:
bootstrap/app.php:
$loader = new \Laminas\Loader\ClassMapAutoloader($classMap);
$loader->register();
Modular Applications:
Zend\* or Laminas\*) via ClassMapAutoloader to avoid namespace collisions:
$loader = new ClassMapAutoloader([
'Zend\Legacy\Class' => __DIR__ . '/vendor/zend/legacy/Class.php',
]);
Dynamic Class Resolution:
AutoloaderFactory to generate autoloaders at runtime (e.g., for microservices):
$autoloader = (new AutoloaderFactory())->createAutoloader([
'Service\\' => __DIR__ . '/services/',
]);
Avoid Duplicates:
Ensure the Laminas loader does not overlap with Laravel’s ClassLoader. Use spl_autoload_register() with a priority flag:
$loader->register(true); // Set to true to prepend (higher priority)
Composer Autoload: Combine with Composer’s autoloader for hybrid setups:
{
"autoload": {
"psr-4": {
"App\\": "app/",
"Legacy\\": "legacy/"
},
"classmap": ["legacy/classmap.php"]
}
}
Testing: Mock the autoloader in PHPUnit:
$this->getMockBuilder(\Laminas\Loader\ClassMapAutoloader::class)
->disableOriginalConstructor()
->setMethods(['loadClass'])
->getMock();
Namespace Collisions:
Laminas\* or Zend\* classes if they conflict with Laravel’s dependencies. Use unique prefixes (e.g., App\Legacy\Laminas\*).Performance Overhead:
Xdebug or Blackfire before production use.PHP Version Mismatches:
Archived Status:
symfony/class-loader for new projects.Class Not Found:
spl_autoload_functions() to inspect registered autoloaders:
print_r(spl_autoload_functions());
Autoloader Conflicts:
spl_autoload_unregister([$loader, 'loadClass']);
Composer Cache Issues:
composer dump-autoload --optimize --no-dev
Priority Handling:
spl_autoload_register($loader, true) to prepend the Laminas loader (higher priority) or omit true to append (lower priority).ClassMap Generation:
classmap.php for static mapping:
composer dump-autoload --classmap-authoritative
Laravel Service Providers:
boot() method:
public function boot()
{
$loader = new \Laminas\Loader\ClassMapAutoloader($this->getClassMap());
$loader->register();
}
Custom Autoloader:
Extend Laminas\Loader\AutoloaderInterface for custom logic:
class CustomAutoloader implements AutoloaderInterface {
public function loadClass($class) {
// Custom logic here
}
}
Plugin System:
Use PluginClassLoader to dynamically load plugins:
$pluginLoader = new PluginClassLoader();
$pluginLoader->addNamespace('App\Plugins');
$pluginLoader->register();
Integration with Laravel Events:
Trigger autoloader events in Laravel’s AppServiceProvider:
public function boot()
{
if ($this->app->environment('local')) {
$loader = new \Laminas\Loader\ClassMapAutoloader($this->getLocalClassMap());
$loader->register();
}
}
How can I help you explore Laravel packages today?