如何使用 Composer 从供应商外部自动加载类?

2022-08-30 23:01:49

我使用作曲家的自动加载器:psr-4

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

这将从/var/www/html/xxx/vendor/yyy/src/DG/Munch

但是如何从 中加载类?/var/www/html/xxx/

我编写了自己的自动加载器,但是当我需要(composer autoload)和我的自动加载器时,直到我在自己的自动加载器中创建类的实例,它才会起作用。vendor/autoload.php


答案 1

该目录将位于项目根目录中。它与目录处于同一级别。srcvendor

如果定义

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

这不会像您所说的那样从 加载类。/var/www/html/xxx/vendor/yyy/src/DG/Munch

因为您的项目结构是:

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

命名空间将映射到内部的类\DG\Munchkin

/var/www/html/xxx/src/DG/Munch而不是在里面

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

但是,如何从 /var/www/html/xxx/ 加载类呢?

在项目的 composer.json(在 /var/www/html/xxx/ 内部)中定义路径:

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

或者在索引中加载作曲家自动加载程序.php或在引导期间,然后手动添加路径:

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

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


答案 2

推荐