2013-10-24 108 views
3

的GitHub库自动加载我PHP Fatal error: Class 'sendwithus\sendwithus_php\lib\API' not found与作曲家问题

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" 
} 

test.php的:

use sendwithus\sendwithus_php\lib\API; 

require_once 'vendor/autoload.php'; 

$api = new API('KEY'); 

我在做什么错?

+0

的API类在命名空间'sendwithus'。你的自动加载的东西应该照顾找到文件;不要试图将名称空间位置放置在角落。 – cHao

+0

是的,但你能举个例子吗? –

+0

'使用sendwithus \ API;' – cHao

回答

6

有东西在你的情况下,会错了一堆。我会尽力纠正它。

首先我看看你所需要的图书馆。它在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实际上,对于类映射键的值相对于应该建立索引库根目录的目录列表。

测试文件夹不需要在这里提及。使用PHPUnit,该文件夹将被扫描以查找包含测试类的任何文件。测试引导程序应包含由Composer生成的vendor/autoload.php文件。

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

所以现在我们要看看OP的提到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" 
} 

的“仓库”键可以包含的类型为“包”包含一个项目的所有必要的信息对象没有这样做,或者没有做到正确。正如我提到的,自动加载在原始定义断裂,所以它必须固定在这里:

 "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只会为您下载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" 
} 
+0

我昨天刚刚做了同样的事情!哈哈;-) –

+0

你说“测试引导应该包括由Composer生成的vendor/autoload.php文件”。你的意思是在lib本身中应该有vendor/autoload.php吗? –

+0

你现在在说哪个库?测试需要访问要测试的代码,最简单的方法是使用生产中使用的自动加载。 PHPUnit已经负责加载测试。因此,生产代码的缺失链接是包含要测试代码的'vendor/autoload.php'。 – Sven

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'), 
+0

“vendor/composer/autoload_namespaces.php”中的路径更改为“lib /”并转储自动载入后,有''sendwithus \\'=>数组($ baseDir。'/ lib')' –

+0

加载它时仍然存在问题。什么是'使用'线? –