【问题标题】:Composer autoloading vendor classesComposer 自动加载供应商类
【发布时间】:2015-11-20 21:32:51
【问题描述】:

我在 Packagist 上有 2 个包。

https://packagist.org/packages/erayalakese/envato-market-api (A) https://packagist.org/packages/erayalakese/envato-update-checker(B)

B 需要 A。

现在我在我的项目中使用 B 包。但我收到 Class 'erayalakese\Envato_Update_Checker' (package B) not found 错误。

这是我的 composer.json 文件

{
    "name": "",
    "description": "",
    "require": {
        "erayalakese/envato-update-checker": "^1.3"
    },
    "authors": ...
}

还有我的项目文件:

<?php
require_once(__DIR__.'/vendor/autoload.php');
new erayalakese\Envato_Update_Checker(...);

当我将它作为临时解决方案添加到我的 composer.json 时,它正在工作:

"autoload": {
    "classmap": ["vendor/"]
}

但我不确定我是否真的需要将 vendor 文件夹添加到 autoload 。我期待它会自动加载我的供应商。

你能告诉我我错过了什么吗?

【问题讨论】:

  • 这样不行,你必须在调用方法之前要求并初始化类。或者您可以使用 PSR-4 并引用具有命名空间的类。 Composer classmap autoload.
  • 我使用 classmap 作为临时解决方案。当我使用类映射时,它不需要一个一个类就可以工作。

标签: php json composer-php autoload


【解决方案1】:

您必须更改两个包的composer.json

两个包都需要定义一个autoload 部分。

参考:https://getcomposer.org/doc/04-schema.md#classmap


erayalakese/envato-market-api

https://github.com/erayalakese/envato-market-api/blob/master/composer.json

{
    "name": "erayalakese/envato-market-api",
    "description": "Envato Market API to verify and download Envato purchases",
    "authors": [
        {
            "name": "Eray Alakese",
            "email": "erayalakese@gmail.com"
        }
    ],
    "require": {},
    "license": "GPL v2",
    "autoload": {
        "classmap": ["Envato_Market_API.php"]
    }
}

现在这个包有一个自动加载类映射定义,它由一个 PHP 文件组成。当你composer install 时,包的自动加载定义将被添加到 Composer 自动加载器中。

另一个包的游戏相同:

erayalakese/envato-update-checker https://github.com/erayalakese/envato-update-checker/blob/master/composer.json

{
    "name": "erayalakese/envato-update-checker",
    "description": "Checks Envato WordPress plugins' updates and download its if any update available",
    "require": {
        "erayalakese/envato-market-api": "^1.0"
    },
    "authors": [
        {
            "name": "Eray Alakese",
            "email": "erayalakese@gmail.com"
        }
    ],
    "license": "GPL v2",
    "autoload": {
        "classmap": ["Envato_Update_Checker.php"]
    }
}

在您的主项目中:

  • 需要主项目的composer.json 中的“更新程序”包
    • 更新程序包通过它的 require 部分包含了 api 包(所以你可以同时获得)
  • require_once(__DIR__ . '/vendor/autoload.php'); 添加到项目引导程序中
  • 通过作曲家自动加载器享受课程:new erayalakese\Envato_Update_Checker(...);

删除这一行:

https://github.com/erayalakese/envato-update-checker/blob/master/Envato_Update_Checker.php#L11

【讨论】:

  • 非常感谢。我还没有尝试,但我有一个问题。为什么我应该在主项目的 composer.json 中同时要求这两个项目?因为 package B 已经需要 package A。如果我只需要 package B 会不会工作?
  • 是的,我的错。您是正确的 Eray,因为您已经在更新程序中拥有 "require": { "erayalakese/envato-market-api": "^1.0" }。当您在主项目中需要更新程序时,您也会获得 API。
猜你喜欢
  • 2019-03-16
  • 2015-03-30
  • 2015-08-20
  • 2017-02-22
  • 2014-10-11
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多