我目前正在开发我自己的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>
这样,作曲家自动加载器将在测试之前运行,因此您无需在库代码中要求它。