如何使用 Zend Service 亚马逊?

Posted

技术标签:

【中文标题】如何使用 Zend Service 亚马逊?【英文标题】:How to use Zend Service Amazon? 【发布时间】:2012-10-09 12:25:05 【问题描述】:

我一直在做大量的挖掘工作,结果头疼得厉害,但没有成功。我正在尝试使用 Zend Amazon 服务(在我的 Codeigniter 框架内)使用 ISBN 获取有关书籍的信息。我最初使用 Zend 1.12 进行了尝试,但我一直收到有关缺少参数 AssociateTag 的错误。我现在正在尝试使用 Zend 2.0,但仍然遇到问题。

这是我在控制器中使用的代码:

    set_include_path(get_include_path() . PATH_SEPARATOR . 'site/libraries');
    require_once 'Zend2/Loader/StandardAutoloader.php';
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $amazon = new Zend_Service_Amazon('[apikey]', 'US', '[secretkey]');
    $item = $amazon->itemLookup('B0000A432X');

我收到以下错误:

致命错误:找不到类“Zend_Loader_Autoloader”。

我的问题是:

如何加载正确的自动加载器? 我应该在参数中的什么位置包含关联标记?过时的 zend 用户指南中没有提及它 Zend 2.0 甚至似乎没有亚马逊服务文件甚至 /service 文件夹。这是什么意思?

【问题讨论】:

【参考方案1】:

注意: zendservice-amazon 附带的演示不能按原样工作。请求必须包含您的 App ID、密钥和关联标签,演示脚本默认情况下不这样做。我花了一段时间才弄明白,如果没有这些,所有查询都会抛出一个异常,指出 HTTP 响应状态为 400。不幸的是,该异常没有说明缺少哪些参数的响应正文。

这里有一些代码可以帮助您开始使用 ZF2 和 ZendService\Amazon

首先,让我概述一下我将在此示例中放置文件的目录结构:

testing
|-Zend
|---Crypt
|---Escaper
|---Http 
|---I18n
|---Loader
|----+AutoloaderFactory.php
|----+... more files
|----+StandardAutoloader.php
|-----Exception
|---Stdlib
|---Uri
|---Validator
|-ZendRest
|-ZendService
|---Amazon
|-----Authentication
|-------Exception
|-----Ec2
|-------Exception
|-----Exception
|-----S3
|-------Exception
|-----SimpleDb
|-------Exception
|-----Sqs
|-------Exception
|----+AbstractAmazon.php
|----+...more files
|----+SimilarProduct.php
|-+test.php

要点是我创建了一个名为testing 的目录,我们将在其中放置 ZF2 自动加载器以及 Amazon 类及其依赖项。正在测试的是一个包含自动加载器(在Loader 中)的Zend 文件夹以及Amazon 服务所在的ZendService 文件夹。

首先,我们需要从 ZF2 获取自动加载器的副本。您遇到问题的部分原因是因为您使用的是与 ZF2 不兼容的 ZF1 自动装载机。要从 ZF2 获取 Autoloader,您可以 download 最新的 ZF2 包并将 Loader 目录从 ZendFramework-2.0.x/library/Zend/ 复制到我们在 testing 目录中创建的 Zend 文件夹中。

现在我们有了自动加载器文件,让我们获取 Amazon 服务文件。关于如何使用 Composer 获取最新包我会写一个详细的答案,但现在我将解释如何手动获取它。要获取可用 ZF2 包的完整列表,请在 http://packages.zendframework.com/packages.json 处加载 JSON 文件,在其中找到 zendframework/zendservice-amazon,确定列表中可用的最高版本,并获取相应的 dist。 编辑截至 2013 年 7 月 11 日,这是最新的 zendservice-amazon 包。

ZendService_Amazon-2.0.2.zip 中的library 目录,将整个ZendService 目录复制到testing 目录中。您现在拥有 ZF2 Amazon 服务文件。

接下来,处理依赖关系。从 ZF2 库中,将目录 CryptEscaperHttpI18nJsonStdlibUriValidator 复制到 @986 内的 testing 目录中@。

您还需要ZendRest 包。将 ZendRest 文件夹从 ZendRest 包中的 library 复制到 testing/ZendRest

现在是一些代码。在testing 文件夹内创建test.php,内容如下:

<?php

require_once './Zend/Loader/StandardAutoloader.php';

$autoloader = new Zend\Loader\StandardAutoloader(array(
    'namespaces' => array(
        'Zend'        => dirname(__FILE__) . '/Zend',
        'ZendRest'    => dirname(__FILE__) . '/ZendRest',
        'ZendService' => dirname(__FILE__) . '/ZendService',
     ),
     'fallback_autoloader' => true));

$autoloader->register();

$tag       = 'prdesign-20'; // replace with your Amazon app ID
$appId     = '1JT2V3QNEHDAMKYR5F02'; // replace w/ your access key from https://portal.aws.amazon.com/gp/aws/securityCredentials
$secretKey = 'Qgjeiw39f8UNzjJgeerrgDs1a193du/v7djDAtn/x';

$query  = new ZendService\Amazon\Query($appId, 'US', $secretKey);
$query->Category('Books')->Keywords('PHP')->AssociateTag($tag);
$result = $query->search();

foreach($result as $item): ?>
<div class="item">
  <a href="<?php echo $item->DetailPageURL ?>" target="_blank"><?php echo $item->Title ?></a>
  by <?php if (is_array($item->Author)): ?>
  <?php echo implode(', ', $item->Author) ?>
  <?php else: ?>
  <?php echo $item->Author ?>
  <?php endif; ?>
</div>
<?php endforeach; ?>

首先,我们 require_once 来自 ZF2 的 StandardAutoloader 类。注册自动加载器后,这是您必须手动包含的唯一类。

接下来,我们创建一个新的自动加载器并传递一些选项。这告诉自动加载器在命名空间ZendZendService 中的类所在的位置。我们告诉自动加载器它们位于当前目录的相应文件夹中。根据需要将dirname(__FILE__) 更改为正确的路径。 fallback_autoloader 选项告诉自动加载器在 include_path 中查找任何命名空间或供应商的类。

调用$autoloader-&gt;register(); 然后实际注册我们在PHP 中设置的自动加载器。自动装载机的设置现已完成。

接下来的 3 行定义了 API 的一些必需参数。

接下来的 3 行很简单,我们现在创建一个 ZendService\Amazon\Query 的新实例并传递我们的亚马逊应用 ID 和密钥。然后,我们通过指定在 Books 中搜索 Category 并将 Keywords 设置为 PHP 来构建查询。我们还添加了所需的 AssociateTag。最后,我们执行搜索。

还没有使用过ZendService\Amazon,所以我无法提供有关使用该类的详细说明,但包含的演示脚本应该可以帮助您开始向亚马逊发送基本查询并处理结果。

希望对您有所帮助。

【讨论】:

找不到更好的答案,谢谢!刚刚试了一下,效果很好。 还有一件事,您会碰巧知道使用 ISBN 进行项目查找的正确语法吗?我似乎无法弄清楚:***.com/questions/12971292/… 如果我不想在搜索中输入类别怎么办,我应该用空白引号发送它吗?还是必须提及类别?? @Deepanshu 尝试将其更改为 $query->Keywords('PHP')->AssociateTag($tag);如果你不指定类别,我没有测试它是否会抛出异常。 我必须先在 Product Advertising API 注册,是付费还是免费?实际上我以前从未在api上工作过。我只需要产品名称、图片和描述,对于社交网站,我会将产品显示为兴趣【参考方案2】:

我已将 Amazon AWS S3 存储桶与 Zend Framework 一起使用。一个简单的例子是照片上传到亚马逊AWS Bucket。在你application/config/application.ini文件中

;AWSAccessKeyId= "AccessKey"
;AWSSecretKey= "SecretKey"
;AWSS3BucketName = "zoshare-images"
;AWSS3GetImageUrl = "http://[name].s3.amazonaws.com/[folder]/"

假设您想将图像上传到存储桶,下面是控制器的示例代码

public function updateAction()
    
if($_FILES["fuPic"]["size"] > 0 || $_FILES["fuPre"]["size"] > 0)
        
            $config = Zend_Registry::get('config');

            $s3 = new Zend_Service_Amazon_S3($config['AWSAccessKeyId'],$config['AWSSecretKey']);

            $bucketName =  $config['AWSS3BucketName'];

            if($_FILES["fuPic"]["size"] == 0)
                unset($_FILES["fuPic"]);
            else if($_FILES["fuPre"]["size"] == 0)
                unset($_FILES["fuPre"]);

            $s3->removeObject($bucketName."/[folder]/".$campaignModel->getCampaignId().'_pic_'.$campaign_olddata->getPicture());
            $s3->removeObject($bucketName."/[folder]/".$campaignModel->getCampaignId().'_pre_'.$campaign_olddata->getPreview());


            if (isset($_FILES["fuPic"]))
            
                $filename = $campaignModel->getCampaignId().'_pic_'.$_FILES["fuPic"]['name'];
                $s3->putObject($bucketName."/[folder]/".$filename, file_get_contents($_FILES["fuPic"]["tmp_name"]),
                    array(Zend_Service_Amazon_S3::S3_ACL_HEADER =>
                    Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ));
                $data['picture'] = $_FILES["fuPic"]['name'];
            

            if (isset($_FILES["fuPre"]))
            
                $filename = $campaignModel->getCampaignId().'_pre_'.$_FILES["fuPre"]['name'];
                $s3->putObject($bucketName."/[folder]/".$filename, file_get_contents($_FILES["fuPre"]["tmp_name"]),
                    array(Zend_Service_Amazon_S3::S3_ACL_HEADER =>
                    Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ));
                $data['preview'] = $_FILES["fuPre"]['name'];
            
        

编码愉快!!!!

【讨论】:

以上是关于如何使用 Zend Service 亚马逊?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 xdebug 与 Zend Studio 一起工作

如何使 Zend Framework 2 与 nginx 一起工作?

使用Zend Framework列出S3目录中的所有文件

Zend:如何正确破坏 PHP 7 中的自定义对象?

如何使 HTTP 调用到达亚马逊 AWS 负载均衡器后面的所有实例?

Zend_Service_Twitter 和 Twitter API 1.1 (ZF 1.12.3)