4

我一直在做很多挖掘工作,结果头疼得厉害,但没有成功。我正在尝试使用 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 文件夹。这是什么意思?
4

2 回答 2

4

注意: 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 类及其依赖项。正在测试的是一个Zend包含自动加载器的文件夹(在 中Loader)以及服务ZendService所在的文件夹Amazon

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

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

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

接下来,照顾依赖关系。从 ZF2 库中,将目录、、CryptEscaperHttpI18nJson和复制到.StdlibUriValidatorZendtesting

您还需要ZendRest包。将ZendRest文件夹从libraryZendRest 包复制到testing/ZendRest.

现在来看一些代码。使用以下内容test.php在文件夹内创建:testing

<?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; ?>

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

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

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

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

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

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

希望有帮助。

于 2012-10-19T00:49:56.587 回答
1

我已将 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'];
            }
        }
}

快乐编码!!!!

于 2012-10-19T03:11:01.440 回答