4

我有PHP Fatal error: Class 'sendwithus\sendwithus_php\lib\API' not found

作曲家.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');

我究竟做错了什么?

4

2 回答 2

8

你的情况有很多问题。我会尽力纠正它。

首先,我查看了您需要的库。它在 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 键的值是相对于应被索引的存储库根目录的目录列表。

此处无需提及测试文件夹。使用 PHPUnit,将扫描该文件夹以查找包含测试类的任何文件。测试引导程序应包含vendor/autoload.phpComposer 生成的文件。

我不知道 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"

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

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

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"
}
于 2013-10-24T22:24:02.670 回答
1

如果您有一个标准的目录结构(如 中vendor/sendwithus/sendwithus_php/lib),您需要将路径修改为相对于composer.json该包的路径:

"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"  

变成:

"sendwithus\\": "lib/"  

看看vendor/composer/autoload_namespaces.php哪个应该列出正在使用的路径。请注意作曲家将如何$vendorDir为您添加前缀,因此您的命名空间不需要引用它

我的项目中的一个例子:

'Core\\' => array($vendorDir . '/alex-patterson-webdev/core/src'),
于 2013-10-24T12:42:12.163 回答