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使用Rest API
如何安装zend framework 2.4.11骨架应用程序