Php 作曲家、自己的软件包和自动加载的故事
我目前正在开发我自己的packagist包,其中包含了另一个包。我想我不太明白自动加载的用法 我的包是一个rest框架,依赖于AltoRouter。我的core需要加载AltoRouter,因为自动加载程序负责加载,所以我使用以下方法将其包含在我的文件中:Php 作曲家、自己的软件包和自动加载的故事,php,composer-php,autoload,autoloader,Php,Composer Php,Autoload,Autoloader,我目前正在开发我自己的packagist包,其中包含了另一个包。我想我不太明白自动加载的用法 我的包是一个rest框架,依赖于AltoRouter。我的core需要加载AltoRouter,因为自动加载程序负责加载,所以我使用以下方法将其包含在我的文件中: require_once __DIR__.'/../vendor/autoload.php'; 我的项目中的文件结构如下: project-root/ ├── src/ | └── core.php └── vendor/ ├─
require_once __DIR__.'/../vendor/autoload.php';
我的项目中的文件结构如下:
project-root/
├── src/
| └── core.php
└── vendor/
├── autoload.php
└── altorouter/
现在,这对于开发我的软件包来说很好,但一旦我想通过packagist和composer发布它,一切都会出错。
一旦我启动另一个项目,需要使用composer定制包并尝试运行包的代码,require_once in core.php就会把一切搞砸,因为它指向了一个错误的位置
我做错什么了吗?我是否必须以不同的方式组织我的包项目
解决方案:
不要在库文件中包含autoload.php。将其包含在引导文件中,例如index.php您的库代码通常不需要composer autoloader。使用composer安装软件包的每个应用程序都负责根据其自身的需要要求自动加载程序。对于web应用程序,这通常发生在入口点脚本中,如公共目录根目录下的index.php 当您单独使用库时,而不是作为依赖项(例如,要运行测试套件),可以使用需要自动加载程序的单独引导脚本 如果使用phpunit,为测试设置自动加载就很简单了。只需将phpunit.xml.dist中的bootstrap属性指向composer autoloader文件:
<phpunit bootstrap="vendor/autoload.php">
...
</phpunit>
这样,composer autoloader将在测试之前运行,因此您无需在库代码中要求它。谢谢。这是完美的工作,比我想象的更容易!