我正在尝试制作一个作曲家包,但我正在努力设置自动加载以在我正在开发它的项目中工作。我有两个项目:Project Foo(我正在其中开发包)。项目栏(我在其中安装了包:)composer require myhandle/mypackage。在 Project Foo 中,我(显然)也必须能够使用该包。但是在我自己的包中设置自动加载不起作用。然而...当我将更改提交到 Github、在 Packagist 更新包并composer update在 Project Bar 中运行时,它就可以工作了(?!)。奇怪的是......如果我composer update从 Project Foo (该项目不起作用)中进行操作。因此,将软件包更新到当前版本(?),使其开始工作。所以它一定与我如何设置自动加载有关。一张纸条:我通过在供应商目录中创建一个新的(空)文件夹来启动该包,然后在那里构建该包。我认为这很聪明,因为它会反映出如果我有composer required包裹的话它会是什么样子。我不知道这是否是不好的做法,因为 Composer 不再“控制”供应商目录中的所有文件。有大量关于如何制作 Composer 包的指南,但没有一个指南解释了在正在开发包的项目中构建文件的好方法。以下是我为“获取错误”所做的操作(在 Project Foo 中):创建新的类文件,例如:myhandle/mypackage/src/Test.php然后我像这样实例化它:$test = new MyNamespace\MyPackageName\Test();然后我收到错误:致命错误:未捕获错误:未找到类“MyNamespace\MyPackageName\Test”这就是 Project Bar 中的工作原理(完全相同的代码)。我找不到有关如何在我正在开发的包中正确设置自动加载的指南。我正在使用这个自动加载文件,这是我在另一个作曲家项目中找到的。我已将其放在我的项目的根目录中。它看起来像这样:<?phpnamespace 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 文档中找不到它,如何在新项目/包中设置它。不过,我可以找到无数关于如何使用自动加载的指南。
1 回答
慕斯王
TA贡献1864条经验 获得超2个赞
检查getcomposer.org上有关自动加载的文档
删除您的自定义自动加载器定义,在composer.json 中注册您的命名空间(希望您已经遵循 PSR-4),运行composer dump-autoload
.
最后但并非最不重要的一点是,无论您何时何地需要使用它,只需包含
require __DIR__ . '/vendor/autoload.php';
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报
0/150
提交
取消