作曲家,自己的包和自动加载的故事



我目前正在开发我自己的packagist软件包,其中包含另一个软件包。我想我不太明白自动加载的使用。

我的软件包是一个休息框架,取决于AltoRouter。我的核心需要加载AltoRouter,由于自动加载器负责,我使用以下方法将其包含在我的文件中:

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

我的项目中的文件结构如下:

project-root/
├── src/
|   └── core.php
└── vendor/
├── autoload.php
└── altorouter/

现在这对于开发我的软件包来说效果很好,但是一旦我想通过packagist(以及作曲家)分发它,一切都会出错。 一旦我开始另一个项目,需要使用作曲家自定义包并尝试运行我的包的代码,require_once(在核心.php)将搞砸一切,因为它指向(现在)错误的位置。

我做错了什么吗?我是否必须以不同的方式构建我的"包"项目?

溶液: 不要在库文件中包含autoload.php。将其包含在引导程序中(例如index.php)

您的库代码通常不需要作曲家自动加载器。每个使用 composer 安装包的应用程序都负责根据自己的需要要求自动加载器。对于 Web 应用程序,这通常发生在入口点脚本中,例如公共目录根目录的入口点脚本index.php

当您单独使用库而不是作为依赖项(例如运行测试套件)时,您可以使用需要自动加载器的单独引导脚本。

如果你使用 phpunit,为你的测试设置自动加载很简单。只需将bootstrap属性指向作曲家自动加载器文件phpunit.xml.dist

<phpunit bootstrap="vendor/autoload.php">
...
</phpunit>

这样,作曲家自动加载器将在测试之前运行,因此您无需在库代码中要求它。

相关内容

  • 没有找到相关文章

最新更新