通过作曲家的自动加载器自动加载第三方库?



我有一个小的Laravel4项目,我需要合并一个第三方库。这个库不能通过GIT或Packagist获得(只能从供应商处获得),所以我将它下载到我的vendor目录中(必须添加一些自定义供应商和包目录)。

而不是仅仅include() -它建议的供应商的文档,我希望只是使用现有的Composer自动加载器,可以用手弄清楚我做错了什么。

目录树是这样的

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

我更新了我的compser.json包括:

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

我也试了试"MerchantCompany\": "src",但是没有效果。

我错过了什么?

注意:来自供应商的类没有命名空间。
我的假设是正确的吗?还是应该在类脚本中添加名称空间?

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

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

中描述的"包"类型的存储库。

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

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

缺少的是自动加载的定义,它可以像其他地方一样添加。如果其他方法都不起作用,请使用"classmap"。然后,Composer将扫描所有文件中出现的类、接口和特征,并生成一个包含相应文件名的数组。但是,如果代码符合该标准,您也可以使用PSR-0或PSR-4。

注意PSR-4只能用于使用名称空间的类!如果没有名称空间,则必须使用PSR-0或classmap。从目录列表的一小段来看,我怀疑代码是否与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"
}

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

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

请注意,由于您是手动定义这些文件的路径,因此它们不需要位于vendor文件夹中。我建议你把图书馆放在一个不同的,非。gitignore文件夹,因为它是一个外部依赖,你不能通过Composer自动包含到你的项目中。

当然,你总是可以唠叨你的供应商更新他们的包,以更符合PSR-4和命名空间之类的东西。:)

相关内容

  • 没有找到相关文章

最新更新