Composer - 在新包中设置自动加载

Composer - Setup autoload in new package

我正在尝试制作一个作曲家包,但我正在努力设置自动加载以在我正在开发它的项目中工作。

我有两个项目:

在 Foo 项目中,我(显然)也必须能够使用该包。但是在我自己的包中设置自动加载不起作用。

但是...当我提交对 Github 的更改时,在 Packagist 更新包并在 Project Bar 中更新 运行 composer update,然后它起作用了(?!)。

而且很奇怪...如果我从 Project Foo(无法正常工作的项目)中执行 composer update。因此,将包更新到它的当前版本 (?),使其开始工作。

所以它一定与我设置自动加载的方式有关。


注:

我通过在 vendor 目录中创建一个新的(空)文件夹来启动包,然后在那里构建包。我认为它很聪明,因为它会反映出我 composer required 包裹的样子。

我不知道这是否是不好的做法,因为 Composer 不再 'are in control' 供应商目录中的所有文件。

关于如何制作 composer 包的指南有很多,但没有一个指南解释了在开发包的项目中构建文件的好方法。


这是我对 'get the error'(在 Project Foo 中)所做的:

  1. 创建新的class文件,例如:myhandle/mypackage/src/Test.php
  2. 然后我像这样实例化它:$test = new MyNamespace\MyPackageName\Test();

然后我得到错误:

Fatal error: Uncaught Error: Class 'MyNamespace\MyPackageName\Test' not found

这就是 Project Bar 中的工作原理(完全相同的代码)。


我找不到有关如何在我正在开发的包中正确设置 自动加载的指南。我正在使用我在另一个作曲家项目中找到的这个自动加载文件。我把它放在我的项目的根目录中。它看起来像这样:

<?php

namespace MyNamespace\MyPackageName;

spl_autoload_register(function($cls) {

    $cls = ltrim($cls, '\');
    if (strpos($cls, __NAMESPACE__) !== 0) {
        return;
    }

    $classWithoutBaseNamespace = str_replace(__NAMESPACE__, '', $cls);

    // Load files from 'src' directory based on their class name without
    // the StoutLogic\AcfBuilder namespace.
    $path = dirname(__FILE__).
            DIRECTORY_SEPARATOR.
            'src'.
            str_replace('\', DIRECTORY_SEPARATOR, $classWithoutBaseNamespace).
            '.php';

    require_once($path);
});

我在 Composer 文档中找不到它,如何在新的 project/package 中设置它。但是我可以找到大量关于如何使用自动加载的指南。

正如 and Daniel Protopopov指出的:

getcomposer.org regarding autoloading

查看文档

删除您的自定义自动加载器定义,在 composer.json 中注册您的命名空间(希望您已经遵循 PSR-4),运行 composer dump-autoload.

最后但同样重要的是,无论何时何地需要使用它,只需包含

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