通过Composer的自动加载器自动加载第三方库?

时间:2014-07-21 23:05:16

标签: laravel laravel-4 composer-php autoload

我有一个小型的Laravel4项目,我需要在其中加入第三方库。该库不能通过GIT或Packagist(仅来自供应商)提供,因此我将其下载到我的vendor目录中(必须添加一些客户供应商和软件包目录)。

而不仅仅是include() - 正如供应商的文档所建议的那样,我希望只使用现有的Composer自动加载器,并且可以用手来弄清楚我是什么&#39我做错了。

我的目录树是这样的

path/to/project
 |__ app
 |__ vendor
 |   |__ merchantcompany
 |       |__ client
 |           |__ src
 |               |__ client.php
 |__ blah
 |__ blah

我更新了compser.json以包含:

"autoload": {
    "psr-4": {
         "MerchantCompany\\": "vendor/merchantcompany/client/src"
     },
     ...

我也试过"MerchantCompany\\": "src",但无济于事。

我错过了什么?

注意:供应商的类不是命名空间 我是否正确地假设这很好,或者我应该在类脚本中添加命名空间吗?

2 个答案:

答案 0 :(得分:2)

你目前做错了。您手动将软件包注入由Composer管理的文件夹(如果认为合适,可以擦除该目录),并将自动加载类型合并到您自己的代码中。

Composer提供了一种向没有它们的项目添加所需元数据的方法。这是https://getcomposer.org/doc/04-schema.md#repositories

中描述的“包”类型的存储库

如果你看一下Smarty给出的例子,你会发现你基本上需要添加一个值为“package”的密钥“type”和一个带有composer.json文件内容的密钥“package”我希望看到项目中包含的内容。

在这种情况下,添加了一个版本标记(与正在使用的Smarty版本同步,以防某些更高版本使用Composer和Packagist,Smarty从版本3.1.x开始使用)以允许Composer引用此版本,该程序包的名称(如果您怀疑自己将获得具有Composer支持的软件,则可以任意组合这两个值),以及从中下载代码的URL(您不必同时提供这两个值) ZIP下载和存储库,如果你不知道它们。)

缺少的是自动加载的定义,可以像其他地方一样添加。如果没有其他工作,请使用“classmap”。然后,Composer将扫描所有文件以查找类,接口和特征的出现,并生成包含附带文件名的数组。但是,如果代码符合该标准,您也可以使用PSR-0或PSR-4。

请注意,PSR-4只能用于使用命名空间的类!如果没有名称空间,则必须使用PSR-0或类映射。从目录列表的短片我怀疑代码是否与PSR-0兼容,所以只需使用classmap即可获得快速结果。

作为建议:

"repositories": [
    {
        "type": "package",
        "package": {
            "name": "merchantvendor/client",
            "version": "1.0.0",
            "dist": {
                "url": "http://example.com/zip-download-url.zip",
                "type": "zip"
            },
            "autoload": {
                "classmap": ""
            }
        }
    }
],
"require": {
    "otherstuff": "...",
    "merchantvendor/client": "1.0.0"
}

答案 1 :(得分:0)

PSR-4是基于命名空间的自动加载标准。如果您的供应商的PHP包不使用名称空间,您将无法使用它。

如果包的文件是基于类的(不是像助手文件那样的过程函数),那么您可以使用Composer's classmap自动加载器。否则,您可以使用files自动加载器,无论您是否使用它,基本上都会在每个请求中包含该文件。

请注意,由于您是手动定义这些文件的路径,因此它们不需要位于vendor文件夹中。我实际上建议您将库放在另一个非.gitignore文件夹中,因为它是一个外部依赖项,您无法通过Composer自动将其包含到项目中。

当然,您总是可以唠叨供应商更新他们的软件包,以便更加符合PSR-4和命名空间等内容。 :)