Xenonite
Xenonite

Reputation: 1957

Composer autoload won't work after deployment

I am relatively new to using composer and autoload to organize my code. I have a git repository and on my local machine, I set up composer in the root dir of my project. I specified everything in a composer.json needed to get running. Using "composer install", all libraries are automatically installed.

{
    "name": "my/repo",
    "description": "bla",
    "version": "1.2.3",
    "require":
    {
        "php": "5.6.*",
        "geraintluff/jsv4": "1.*",
        "lcobucci/jwt": "^3.0"
    },
    "autoload":
    {
        "psr-4":
        {
            "MyNamespace\\": "src/"
        }
    }
}

So - once I ran "composer install" on my local machine, everything was autoloaded in my code. Fine.

But now I need to deploy the whole thing on another linux system. So i pull from the git and run composer install. All the libraries are fetched and the autoload file shows up in vendor/

Yet, I cannot use autoload (yes, I did require_once(__DIR__ . '/../vendor/autoload.php');). Everytime I try to instantiaze a class, i get a

PHP Fatal error:  Class 'X' not found in /var/www/bla/x.class.php on line 123

Using use X; does not solve the problem, nor does trying to instantiate the class with its full Namespace name (e.g. $x = new \A\B\X();)

Here is the folder structure (if this matters):

+ src/
| + X.class.php // namespace here is "MyNamespace"
| + Y.class.php // same namespace
+ test/
  + run.php // namespace is "Test"

Here is a snippet of this code (run.php):

<?php namespace Test; // different namespace than the rest of the code
// making the namespace also "\MyNamespace" wouldnt work either

require_once(__DIR__ . '/../vendor/autoload.php');

use \MyNamespace\Y; // whether this line is here or not does not change the error

session_start();

// same error as with "just" implements Y {}
class SomeClass implements \MyNamespace\Y {
    // ...
}

?>

So here, the Fatal error is thrown for the line where Y is extended. No matter if I use the full namespace or not. Only thing that will help is a require_once()...

So, this forces me to go back to the cumbersome way of doing all the require/includes myself!? Is there any way to solve this?

PS: composer dumpautoload wont help

PPS: composer validate shows no errors

Upvotes: 0

Views: 899

Answers (1)

jpschroeder
jpschroeder

Reputation: 6926

For PSR-4 compliance, your file structure should be:

+ src/
| + X.php
| + Y.php

Note the removal of the .class.php suffix. http://www.php-fig.org/psr/psr-4/

Upvotes: 1

Related Questions