我目前正在开发自己的包装包,其中包含另一个包装。我想我不太明白使用自动加载。
我的包是一个休息框架,取决于AltoRouter
。我的核心需要加载AltoRouter
,因为自动加载器负责我通过使用以下内容将其包含在我的文件中:
require_once __DIR__.'/../vendor/autoload.php';
我项目中的文件结构如下:
project-root/
├── src/
| └── core.php
└── vendor/
├── autoload.php
└── altorouter/
现在这适用于开发我的软件包,但是一旦我想通过packagist(以及作曲家)分发它,一切都会出错。
一旦我开始另一个项目,需要我的自定义包与composer并尝试运行我的包的代码,require_once
(在core.php中)会搞砸一切,因为它指向(现在)错误的位置。 / p>
我有什么问题吗?我是否必须以不同的方式构建我的“包”项目?
解决方案:
不要在库文件中包含autoload.php
。将其包含在bootstrap文件中(例如index.php
)
答案 0 :(得分:1)
您的库代码通常不需要编辑器自动加载器。使用composer安装程序包的每个应用程序都负责根据自己的需要使用自动加载器。对于Web应用程序,这通常发生在公共目录根目录下的index.php
等入口点脚本中。
当您单独使用库时,而不是作为依赖项(例如运行测试套件)时,您可以使用需要自动加载器的单独引导脚本。
如果你使用phpunit,为你的测试设置自动加载很简单。只需将bootstrap
中的phpunit.xml.dist
属性指向编辑器自动加载器文件:
<phpunit bootstrap="vendor/autoload.php">
...
</phpunit>
这样,作曲家自动加载器将在您的测试之前运行,因此您无需在库代码中要求它。