How to use Composer to autoload classes from outside the vendor?

28,997

The src directory would be in your project root. Its on the same level as vendor directory is.

If you define

"autoload": {
    "psr-4": {
        "DG\\Munchkin\\": "src/DG/Munch/"
    }
}

this will not load classes from /var/www/html/xxx/vendor/yyy/src/DG/Munch, like you stated.

Because your project structure is:

/var/www/html/
 +- /xxx (project)
     - composer.json
     +- /src
        +- DG
           +- Munch
     +- /vendor
        - autoload.php
        +- vendor-projectA
        +- vendor-projectB
        +- yyy

The \DG\Munchkin namespace would map to classes inside

/var/www/html/xxx/src/DG/Munch and not inside

/var/www/html/xxx/vendor/yyy/src/DG/Munch.

But how can I load classes from /var/www/html/xxx/?

Define the paths in the composer.json (inside /var/www/html/xxx/) of your project:

"autoload": {
    "psr-4": {
        "ProjectRoot\\" : "", 
        "NamspaceInSourceDir\\" : "src/"         
    }
 }

or load the composer autoloader in your index.php or during it's bootstrap and add the paths manually:

$loader = require 'vendor/autoload.php';
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__);
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx');

Referencing: https://getcomposer.org/doc/04-schema.md#autoload

Share:
28,997
Tomasz Szymanek
Author by

Tomasz Szymanek

Junior PHP Developer in Perform Group

Updated on October 07, 2021

Comments

  • Tomasz Szymanek
    Tomasz Szymanek over 2 years

    I use psr-4 autoloader from composer:

    "autoload": {
        "psr-4": {
            "DG\\Munchkin\\": "src/DG/Munch/"
        }
    }
    

    This loads classes from /var/www/html/xxx/vendor/yyy/src/DG/Munch

    But how can I load classes from /var/www/html/xxx/?

    I wrote my own autoloader, but when I require vendor/autoload.php (composer autoload) and my autoloader, it won't work until I create instance of a class in my own autoloader.