【问题标题】:Composer, own packages and the story with autoload作曲家,自己的包和自动加载的故事
【发布时间】:2018-01-23 19:46:27
【问题描述】:

我目前正在开发自己的 packageagist 包,其中包含另一个包。我想我不太了解 autoload 的用法。

我的包是一个休息框架,依赖于AltoRouter。我的核心需要加载 AltoRouter 并且由于自动加载器负责我使用以下内容将其包含在我的文件中:

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

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

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

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

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

解决方案: 不要在你的库文件中包含autoload.php。将其包含在引导文件中(例如 index.php

【问题讨论】:

    标签: php composer-php autoload autoloader


    【解决方案1】:

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

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

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

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

    这样,composer 自动加载器将在您的测试之前运行,因此您不需要在库代码中使用它。

    【讨论】:

    • 谢谢。这完美无瑕,比我想象的要容易!
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2013-12-09
    • 2016-10-24
    • 2013-03-05
    • 2015-09-24
    • 2020-06-24
    相关资源
    最近更新 更多