-->

How to use Zend Service Amazon?

2020-07-17 05:33发布

问题:

I've been doing a lot of digging around and have ended up with a huge headache and no success. I am trying to use the Zend Amazon Service (within my Codeigniter framework) to fetch information about a book using its ISBN. I initially tried it with Zend 1.12 but I kept getting an error about missing parameter AssociateTag. I am now trying with Zend 2.0 but still getting problems.

This is the code I am using within my controller:

    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');

I get the following error:

Fatal error: Class 'Zend_Loader_Autoloader' not found.

My questions are:

  • How to load the correct autoloader?
  • Where do I include the associate tag in the parameters? There is no mention of it in the outdated zend user guide
  • Zend 2.0 doesn't even seem to have the amazon service files or even the /service folder. What does this mean?

回答1:

Note: The demo included with zendservice-amazon doesn't work as is. Requests must include your App ID, Secret Key, and Associate Tag which the demo script doesn't do by default. It took me a while to figure this out, without these, all queries throw an exception saying the HTTP response status was 400. Unfortunately the exception doesn't have the response body which says what parameters were missing.

Here is some code that will get you started with ZF2 and ZendService\Amazon.

To start, let me outline the directory structure of where I will be putting files for this example:

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

The gist is I have created a directory called testing where we will place the ZF2 autoloader as well as the Amazon classes and their dependencies. Under testing is a Zend folder that contains the autoloader (in Loader) and also a ZendService folder where the Amazon service goes.

First, we need to get a copy of the autoloader from ZF2. Part of the reason you were having trouble is because it looks like you are using the ZF1 autoloader which is incompatible with ZF2. To get the Autoloader from ZF2, you can download the latest ZF2 package and copy the Loader directory from ZendFramework-2.0.x/library/Zend/ into the Zend folder we created in the testing directory.

Now that we have the autoloader files, let's grab the Amazon service files. I'll write a detailed answer on how to use Composer to get the latest package, but for now I'll explain how to get it manually. To get the full list of available ZF2 packages, load up the JSON file at http://packages.zendframework.com/packages.json In it find, zendframework/zendservice-amazon, determine the highest version available from the list, and grab the corresponding dist. EDIT As of 11th Jul 2013, this is the latest zendservice-amazon package.

From the library directory in ZendService_Amazon-2.0.2.zip, copy the entire ZendService directory into the testing directory. You now have the ZF2 Amazon service files.

Next, take care of the dependencies. From the ZF2 library, copy the directories, Crypt, Escaper, Http, I18n, Json, Stdlib, Uri, and Validator into the Zend directory inside testing.

You will also need the ZendRest package. Copy the ZendRest folder from library from the ZendRest package to testing/ZendRest.

Now for some code. Create test.php inside the testing folder with the following contents:

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

First, we require_once the StandardAutoloader class from ZF2. Once the autoloader is registered, this is the only class you have to manually include.

Next, we create a new autoloader and pass some options. This tells the autoloader where classes in the namespace Zend and ZendService are located. We tell the autoloader they live in the respective folders in our current directory. Change dirname(__FILE__) to the correct path as needed. The fallback_autoloader option tells the autoloader to look for classes of any namespace or vendor in the include_path.

Calling $autoloader->register(); then actually registers the autoloader we set up within PHP. Setting up the autoloader is now finished.

The next 3 lines define some required parameters for the API.

The next 3 lines are straightforward, we now create a new instance of ZendService\Amazon\Query and pass our Amazon app ID and secret key. We then build the query by specifying to search in the Books Category and set the Keywords to be PHP. We also add the required AssociateTag. Finally, we execute the search.

I haven't yet used ZendService\Amazon yet so I can't provide detailed instructions on using the class but the included demo script should get you started with sending basic queries to Amazon and processing the results.

Hope that helps.



回答2:

i have use Amazon AWS S3 bucket along with Zend Framework. A simple example is photo upload to amazon AWS Bucket.In you application/config/application.ini file

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

Lets say you want to upload an image to bucket, below is sample code of controller

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

Happy Coding !!!!