gpt4 book ai didi

php - 使用 Composer 问题自动加载 GitHub 存储库

转载 作者:可可西里 更新时间:2023-11-01 00:21:38 25 4
gpt4 key购买 nike

我遇到 PHP fatal error :找不到类 'sendwithus\sendwithus_php\lib\API'

Composer .json:

{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/sendwithus_php",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
}
}
}
},
"require": {
"sendwithus/sendwithus_php": ">=1.0.3"
}, "autoload": {
"psr-0": {
"Foo\\": "src/",
"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"
}
}, "minimum-stability" : "dev"
}

测试.php:

use sendwithus\sendwithus_php\lib\API;

require_once 'vendor/autoload.php';

$api = new API('KEY');

我做错了什么?

最佳答案

你的情况有很多问题。我会尽量改正它。

首先,我查看了您需要的库。它在 Github 上是公开的,它有一个 composer.json有错误的文件。

{
"name": "sendwithus/api",
"version": "1.0.3",
"require": {},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/sendwithus/sendwithus_php"
}
]
}

这些信息略有错误。只有名称格式正确。

  • 不应该有版本。通过在 git 中标记代码来检测版本。
  • 如果不需要,则可以省略该键。
  • 当前存储库 URL 不应包含在它自己的存储库中。
  • 提及许可证会很好 - 目前使用此库的每个人都应该害怕侵犯版权。
  • 重要但缺失的信息:自动加载是如何配置的?

调查该存储库的内容很快发现它不符合 PSR-0,因此唯一可行的替代方法是类映射自动加载 - 这已经足够了,因为 lib 中只有两个文件。文件夹。

正确的自动加载定义是:

    "autoload": {
"classmap": ["lib"]
}

有关如何构造它的详细信息,请参阅 http://getcomposer.org/doc/04-schema.md#classmap实际上,classmap 键的值是一个目录列表,该目录相对于应该被索引的存储库根目录。

test文件夹这里就不用说了。使用 PHPUnit,将扫描该文件夹以查找包含测试类的任何文件。测试 Bootstrap 应包括 vendor/autoload.php Composer 生成的文件。

我不知道 OP 是否负责此存储库或是否可以更改它。上面的信息应该在存储库本身中实现,但如果不能,它也很有帮助,因为它也可以进入“包”定义。

所以现在我们要看看提到的 composer.json OP 的:

{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/sendwithus_php",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
}
}
}
},
"require": {
"sendwithus/sendwithus_php": ">=1.0.3"
}, "autoload": {
"psr-0": {
"Foo\\": "src/",
"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"
}
},
"minimum-stability" : "dev"
}

“repositories”键可以包含类型为“package”的对象,这些对象包含未能这样做或未能正确完成的项目的所有必要信息。正如我提到的,自动加载在原始定义中被破坏,因此必须在此处修复:

        "sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/api",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
},
"autoload": {
"classmap": ["lib"]
}
}
}

这将正确引用该存储库并启用自动加载。请注意,此处的名称已更改为原始名称 - 如果此库以两个不同的名称(一个在此处定义,另一个在原始存储库中)但使用相同的命名空间和类名,则可能会引发麻烦。

现在存储库信息已修复,所有其他内容在 composer.json 中照常工作。

"require": {
"sendwithus/api": "1.0.3"
},
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
},
"minimum-stability" : "dev"

请注意,此处定义的自动加载仅适用于此库或应用程序。不要在此处包括依赖项的自动加载!

然后我们会处理您的代码:

use sendwithus\sendwithus_php\lib\API;

require_once 'vendor/autoload.php';

$api = new API('KEY');

命名空间错误。不要使用来自 Composer 的名称。使用您正在导入的代码中的名称。这是正确的:

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

use sendwithus\API;

$api = new API("apikey");

请注意,您不能在 Composer 中通过重命名来更改库的命名空间。 Composer 只为您下载 PHP 源文件,它不会更改文件中的代码。

我的决赛 composer.json文件是这样的:

{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/api",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
},
"autoload": {
"classmap": ["lib"]
}
}
}
},
"require": {
"sendwithus/api": "1.0.3",
},
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
},
"minimum-stability": "dev"
}

关于php - 使用 Composer 问题自动加载 GitHub 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19566102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com