Zend Framework 2 使用 composer 自动加载第三方库

Posted

技术标签:

【中文标题】Zend Framework 2 使用 composer 自动加载第三方库【英文标题】:Zend Framework 2 Autoload Third Party library using composer 【发布时间】:2013-12-06 15:46:24 【问题描述】:

我正在尝试使用 composer 将第三方库自动加载到我的 ZF2 应用程序中 - 特别是 Google api。 我在 SO 上遵循this post 中的答案,编辑了我的 composer.json

"autoload": 
    "psr-0": "Googleanalytics\\": "vendor/google-api-php-client/src/"

并运行更新。 我可以在 composer/autoload_namespaces.php 中看到条目

'Googleanalytics\\' => array($vendorDir . '/google-api-php-client/src'),

但是当我尝试在该目录 (Google_Client.php) 中实例化一个类时,我仍然得到一个未找到的致命错误类。

任何想法我错过了什么? 我正在尝试使用它的类中包含该文件:

use Googleanalytics\Google_Client;

我尝试重命名目录以防 - 是问题,并在该目录中创建一个简单的 test.php 文件以防类名 (Google_Client.php) 中的下划线是问题,但仍然是相同的错误.

还有什么我需要添加到我的 ZF2 应用程序来自动加载这个库的吗? 另请注意,我决定不使用 ZendGdata,因为该组件似乎不再维护。 提前致谢

【问题讨论】:

您链接的库与 psr-0 不兼容,这就是 psr-0 自动加载器无法工作的原因。我不确定它遵循什么标准,但很可能您必须手动包含文件、编写自己的自动加载器或查找其他库。 【参考方案1】:

您的软件的自动加载定义不应包含任何供应商模块的自动加载定义。将其移至您用于包含该软件的包定义中。

在其他新闻中:如果它不适用于 PSR-0,则类映射自动加载器应该会处理它。

更新

如何为不提供 composer.json 的存储库创建包

基本上你只需要几条信息:

    版本号及其在该存储库中的位置。 您尝试使用的软件的名称 - 您可能只想添加供应商名称,而不是对模块太有创意。 知道如何自动加载包,即知道软件使用哪个路径并将类映射自动加载器应用到它。 至少以下一项,最好同时具备:
      托管代码的存储库的 URL 已发布版本的下载网址

如果是“google-api-php-client”,a) 存储库的 URL 是 http://google-api-php-client.googlecode.com/svn/,b) 最新版本号是 0.6.7,A) 该软件包的下载 URL 是http://google-api-php-client.googlecode.com/files/google-api-php-client-0.6.7.tar.gz.

现在你把它填入这个“模板”:

"repositories": [
    
        "type": "package",
        "package": 
            "name": "name from (2)",
            "version": "version from (1)",
            "dist": 
                "url": "URL from (4/2)",
                "type": "tar or zip according to download"
            ,
            "source": 
                "url": "URL from (4/1)",
                "type": "svn",
                "reference": "tags/version from (1)"
            ,
            "autoload": 
                "classmap": ["path from (3)"]
            
        
    
]

然后您可以在您的要求中要求该确切的包:"require": "name from (2)": "version from (1)"

对于您正在使用的 google 包,这基本上会让您使用它:

"require": 
    "google/google-api-php-client":"*"
,
"repositories": [
    
        "type": "package",
        "package": 
            "name": "google/google-api-php-client",
            "version": "0.6.7",
            "dist": 
                "url": "http://google-api-php-client.googlecode.com/files/google-api-php-client-0.6.7.tar.gz",
                "type": "tar"
            ,
            "source": 
                "url": "http://google-api-php-client.googlecode.com/svn/",
                "type": "svn",
                "reference": "tags/0.6.7"
            ,
            "autoload": 
                "classmap": ["src/"]
            
        
    
]

添加这些主要是样板文件的好处是您现在可以免费下载该软件。您不必关心如何手动下载、解包和安装包。您确实将这个软件的自动加载信息添加到您自己的composer.json中,但是它包含在您要使用的软件的包定义中,它不包含在您自己的软件的自动加载区域中。

您也不必担心 Composer 会意外删除您手动下载的包。

【讨论】:

谢谢 - 类图正是我要找的。​​span> 在下面为需要的人添加了更详细的解决方案描述:) 回应您的评论,这就是我认为您上面的类映射自动加载器评论的意思——通过在作曲家中使用类映射键可以解决这个问题。当您说“您的软件不应包含任何供应商模块的自动加载定义”时,您还可以扩展吗?【参考方案2】:

对于希望使用 Composer 将第三方库添加到 ZF2 的其他人,以下是对我有用的步骤。

    将第三方库复制到供应商文件夹

    将以下行添加到 composer.json

    “自动加载”: "classmap": ["vendor/PATH TO LIBRARY"]

    运行 php composer.phar 更新

然后你应该在 composer 文件夹中的文件中看到第三方库中的所有类:composer/autoload_classmap.php

在您的 zf2 应用程序中从库中实例化任何类时,不要忘记在类名前加上 \。 例如:

$client = new \Google_Client();

【讨论】:

这与我所说的完全矛盾,因为现在您的软件包含其他软件的自动加载定义。 :) 我想我将说明为没有自带 composer.json 文件的软件创建包定义的步骤。

以上是关于Zend Framework 2 使用 composer 自动加载第三方库的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework 2,使用选择

如何使用Zend Framework 2使用Rest API

如何安装zend framework 2.4.11骨架应用程序

让 Zend Framework 2 Memcached 工作

Zend Framework 2 - 如何使用外部库

Zend Framework 2 + Doctrine 2 [关闭]