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

时间:2018-01-23 19:46:27

标签: php composer-php autoload autoloader

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

我的包是一个休息框架,取决于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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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