如何使用Zend Service Amazon?

4

我做了很多调查,最终仍然一无所获且头痛不已。我正在尝试使用Zend Amazon Service(在我的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”类。
我的问题是:
1. 如何加载正确的自动加载程序? 2. 我应该在参数中包含关联标签,但是旧的zend用户指南没有提及它,我该放在哪里? 3. Zend 2.0甚至似乎没有亚马逊服务文件,甚至/service文件夹也没有。这意味着什么?
2个回答

4
注意: zendservice-amazon附带的演示不会直接运行。请求必须包括您的App ID、Secret Key和Associate Tag,但演示脚本默认情况下不会包含这些信息。我花了一段时间才弄清楚,没有这些信息,所有查询都会抛出异常,显示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类及其依赖项。在testing下有一个包含自动加载程序(在Loader中)的Zend文件夹,还有一个ZendService文件夹,其中包含Amazon服务。
首先,我们需要获取来自ZF2的自动加载程序副本。你遇到麻烦的部分原因是看起来你正在使用与ZF2不兼容的ZF1自动加载程序。要获取ZF2的Autoloader,可以下载最新的ZF2软件包,并从ZendFramework-2.0.x/library/Zend/中复制Loader目录到我们在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.ziplibrary目录中,将整个ZendService目录复制到testing目录中。现在您拥有了ZF2 Amazon服务文件。
接下来,处理依赖项。从ZF2库中复制目录 CryptEscaperHttpI18nJsonStdlibUriValidatortesting 文件夹内的 Zend 目录。
您还需要 ZendRest 包。将 ZendRest 包中的 library 中的 ZendRest 文件夹复制到 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; ?>

首先,我们从ZF2中require_onceStandardAutoloader类。一旦自动加载器被注册,这是唯一需要手动包含的类。
接下来,我们创建一个新的自动加载器并传递一些选项。这告诉自动加载器命名空间ZendZendService中的类所在位置。我们告诉自动加载器它们位于当前目录中各自的文件夹中。根据需要更改dirname(__FILE__)为正确的路径。 fallback_autoloader选项告诉自动加载器在include_path中查找任何命名空间或供应商的类。
然后调用$autoloader->register();实际上在PHP中注册了我们设置的自动加载器。现在自动加载器的设置已经完成。
接下来的三行定义了API所需的一些必要参数。
下面的3行代码很简单,我们现在创建一个新的ZendService\Amazon\Query实例,并传递我们的亚马逊应用程序ID和密钥。然后通过指定在图书类别中搜索并将关键字设置为PHP来构建查询。我们还添加了所需的AssociateTag。最后,我们执行搜索。
我还没有使用过ZendService\Amazon,因此无法提供有关使用该类的详细说明,但包含的演示脚本应该可以帮助您开始发送基本查询到亚马逊并处理结果。
希望这有所帮助。

如果我不想在搜索中输入类别,我应该用空引号发送吗?还是必须提到类别? - Deepanshu Goyal
@Deepanshu 尝试将其更改为 $query->Keywords('PHP')->AssociateTag($tag); 我没有测试是否会在您未指定类别时抛出异常。 - drew010
我需要先在产品广告API注册吗?这是付费还是免费的?实际上,我以前从未使用过API。我所需要的只是产品名称、图片和描述,这是为了社交网络网站,我将把产品显示为兴趣。 - Deepanshu Goyal
@Deepanshu 我相信你需要注册才能使用API,但据我所知它是免费的。 - drew010
@drew010 谢谢你,它完全正常运行了...最后一个问题,我看了文档,它每页只返回10条记录,而且只有一页,有没有办法可以增加它,我想要在分页中显示记录,否则我将不得不在每次下一页的点击时再次调用API,而不是一次性绑定所有数据。 - Deepanshu Goyal
显示剩余2条评论

1
我使用Amazon AWS S3 Bucket和Zend Framework。一个简单的例子是将照片上传到Amazon 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'];
            }
        }
}

编程愉快!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接