4

私は多くのことを掘り下げてきましたが、大きな頭痛の種になってしまい、成功しませんでした。Zend Amazonサービス(Codeigniterフレームワーク内)を使用して、ISBNを使用して本に関する情報を取得しようとしています。最初はZend1.12で試しましたが、パラメーターAssociateTagが見つからないというエラーが発生し続けました。現在Zend2.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には、amazonサービスファイルや/serviceフォルダーさえないようです。これは何を意味するのでしょうか?
4

2 に答える 2

4

注: zendservice-amazonに含まれているデモはそのままでは機能しません。リクエストには、アプリ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からオートローダーのコピーを取得する必要があります。問題が発生した理由の1つは、ZF2と互換性のないZF1オートローダーを使用しているように見えるためです。ZF2からオートローダーを入手するには、最新の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ます。これで、ZF2Amazonサービスファイルができました。

次に、依存関係に注意してください。ZF2ライブラリから、ディレクトリ、、、、、、、、、をコピーし、内CryptEscaperディレクトリHttpにコピーします。I18nJsonStdlibUriValidatorZendtesting

ZendRestパッケージも必要になります。ZendRestパッケージからにZendRestフォルダをコピーします。librarytesting/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で検索するように指定してクエリを作成し、をPHPにCategory設定します。Keywordsまた、必要なAssociateTagを追加します。最後に、検索を実行します。

はまだ使用ZendService\Amazonしていないので、クラスの使用に関する詳細な手順を提供することはできませんが、含まれているデモスクリプトを使用すると、Amazonに基本的なクエリを送信して結果を処理することができます。

お役に立てば幸いです。

于 2012-10-19T00:49:56.587 に答える
1

ZendFrameworkと一緒にAmazonAWSS3バケットを使用しています。簡単な例は、AmazonAWSBucketへの写真のアップロード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 に答える