【问题标题】:Zend Framework 2 Autoload Third Party library using composerZend Framework 2 使用 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 自动加载器无法工作的原因。我不确定它遵循什么标准,但很可能您必须手动包含文件、编写自己的自动加载器或查找其他库。

标签: zend-framework2 composer-php


【解决方案1】:

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

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

更新

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

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

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

如果是“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 的其他人,以下是对我有用的步骤。

  1. 将第三方库复制到供应商文件夹
  2. 将以下行添加到 composer.json

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

  3. 运行 php composer.phar 更新

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

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

$client = new \Google_Client();

【讨论】:

  • 这与我所说的完全矛盾,因为现在您的软件包含其他软件的自动加载定义。 :) 我想我将说明为没有自带 composer.json 文件的软件创建包定义的步骤。
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
相关资源
最近更新 更多