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

Posted

技术标签:

【中文标题】如何使用 Composer 从供应商外部自动加载类?【英文标题】:How to use Composer to autoload classes from outside the vendor? 【发布时间】:2015-03-30 22:44:53 【问题描述】:

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

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

这会从/var/www/html/xxx/vendor/yyy/src/DG/Munch 加载类

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

我编写了自己的自动加载器,但当我需要 vendor/autoload.php(作曲家自动加载器)和我的自动加载器时,在我自己的自动加载器中创建类的实例之前,它无法工作。

【问题讨论】:

您不能简单地使用filesclassmap 自动加载器吗? getcomposer.org/doc/04-schema.md#autoload 是的,文件或类图应该可以解决问题。 不,因为我无法从自动加载部分的外部供应商文件夹中选择文件夹。 我需要 composer 通过绝对路径(而不是补丁 IN 供应商目录)自动加载类。 "这会从...加载类" 不是它不会使这个问题无法回答,因为它是基于不正确的假设。 【参考方案1】:

src 目录将位于您的项目根目录中。 它与vendor 目录处于同一级别。

如果你定义了

"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/"         
    
 

或在您的 index.php 中或在它的引导过程中加载 composer 自动加载器并手动添加路径:

$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

【讨论】:

以上是关于如何使用 Composer 从供应商外部自动加载类?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony4 使用外部类库作为服务

使用供应商目录中的 autoloader.php 自动加载无法正常工作

Laravel 供应商自动加载不起作用

作曲家自动加载在生产服务器上不起作用

Composer/PSR - 如何自动加载函数?

Composer 自动加载自定义类