PSR-4 autoloading not working

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Mastering PSR-4: Why Your Autoloading Fails on the Webserver

As developers, we often encounter frustrating situations where code behaves perfectly in our local development environment but throws cryptic errors when deployed to a live webserver. One of the most common culprits in modern PHP applications—especially those leveraging Composer and PSR-4 autoloading—is exactly this: the "works locally, fails remotely" paradox.

This post dives deep into why your PSR-4 setup might be failing on production, focusing specifically on server configuration scenarios that often trip up developers when moving from a local machine to a live environment.

The Anatomy of the Problem: Local vs. Server Discrepancy

You have meticulously set up your PSR-4 mapping:

"psr-4": {
    "Modules\\": "app/modules"
}

And you have run composer dumpautoload. This setup tells PHP’s autoloader how to map namespaces to file paths. Locally, this works flawlessly because Composer has correctly generated the necessary files within the vendor directory, and your local environment is perfectly configured to read them.

The error you are seeing—Class Modules\ModuleName\Controllers\BackendController does not exist—is a symptom that the runtime environment (the webserver) cannot find the class definition, even though the file physically exists on the disk. This points away from a simple typo in your code and toward an issue with how the autoloader is being invoked or how the environment is set up.

Server Configuration Scenarios Causing Autoload Failures

Since you mentioned that Composer isn't installed directly on the webserver, the problem usually boils down to missing environmental context rather than a broken file. Here are the most common scenarios:

1. Incorrect Autoloader Inclusion

The single most critical step for PSR-4 autoloading is ensuring that PHP actually loads the autoloader file generated by Composer. On the server, you must explicitly instruct your application entry point (e.g., index.php) to load the vendor files.

Best Practice: Always ensure that the script that boots your application includes the Composer autoloader. This is usually done via:

require __DIR__ . '/vendor/autoload.php';

If this line is missing or incorrectly placed on the server, PHP will never know where to look for the class definitions, leading directly to a ReflectionException.

2. File System Permissions

Even if you uploaded all files, web servers (like Apache or Nginx running PHP-FPM) operate under strict security contexts. If the user account running the webserver process does not have the necessary read permissions for the entire vendor directory, PHP cannot scan those files to build the autoloader map, resulting in the class not being found.

3. Path and Working Directory Issues

When running commands locally (e.g., using php artisan), your shell environment often sets the working directory correctly. On a webserver, the current working directory might be different. If your application logic relies on relative paths within the autoloader or configuration files, incorrect path resolution can cause failures that look like autoloading errors.

Implementing Robust Solutions

To ensure your application remains robust across all environments, adopt these practices:

  1. Verify vendor Presence: Double-check that the entire vendor directory, including autoload.php, was successfully uploaded and is accessible by the web server user.
  2. Use Framework Conventions: If you are using a framework like Laravel (which heavily relies on this structure), ensure you are following their established deployment procedures. For instance, frameworks maintain specific ways to handle service providers and class loading that abstract away these low-level issues. As seen in the documentation for Laravel, understanding these conventions is key to smooth deployments.
  3. Environment Variables: Use environment variables (like APP_PATH) consistently across your application bootstrap files to ensure relative paths resolve correctly regardless of the server's execution context.

Conclusion

The failure you are experiencing is almost never a defect in the PSR-4 definition itself, but rather an environmental mismatch between your local development setup and the production webserver environment. By focusing on the loading mechanism (autoload.php inclusion) and file system permissions, you can resolve these elusive deployment errors. Remember, consistency between environments is the cornerstone of reliable software development.