传递给Aws \ AwsClient :: getCommand()的参数2必须是类型数组,字符串给定

时间:2015-09-22 14:33:15

标签: php api amazon-web-services

我跟随this page安装。

这是SDK的第3版。基本用法here

<?php
require 'vendor/autoload.php';

use Aws\CloudFront\CloudFrontClient;
$cdn = new CloudFrontClient(
['version' => 'latest',
 'region'  => 'us-east-1']
);

// Create a new invalidation.
$response = $cdn->create_invalidation('EPYAAAAAAPAA', 'aws-clear-cache' . time(), "/*");

根据this article

  

可捕获的致命错误:参数2传递给   Aws \ AwsClient :: getCommand()必须是类型数组,字符串给定,   呼唤   /Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php上线   167并定义于   /Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php上线   211

更新&amp;工作解决方案:

$config = array(
                'region' => 'us-east-1',
                'version' => '2015-07-27',
                'credentials' => array(
                    'key'    => env('AMAZON_KEY_CLOUDFRONT'),  
                    'secret' => env('AMAZON_SECRET_CLOUDFRONT') 
                )
            );

        $cdn = new CloudFrontClient($config);

        $cache =    array('DistributionId' => env('CLOUDFRONT'),
                    'InvalidationBatch' => array(
                        'CallerReference' => 'none',
                        'Paths' => array(
                            'Quantity' => 1,
                            'Items' => array( 'test' => '/*')
                            )
                        )

            );

        // Create a new invalidation.
        $response = $cdn->createInvalidation($cache);
        var_dump($response);

1 个答案:

答案 0 :(得分:2)

我看了一下这里发生的事情,显然你正在使用无效的方法签名。

首先,AWS PHP SDK使用名为&#34;服务描述模型&#34;获取指定版本的API接口。在这种情况下,这意味着他们使用一些元编程技术来提供看起来像普通PHP函数调用的接口,但这些函数在SDK中没有硬编码。它们并不是我们通常认为的存在,至少不像普通的PHP函数那样存在。一些PHP魔法正在下面发生。

当您致电$cdn->create_invalidation()时,它会在继承自Aws\CloudFront\CloudFrontClient的{​​{1}}实例上运行。这些类(也没有任何祖先)实际上都没有Aws\AwsClient方法实现。但是::create_invalidation()确实实现了PHP魔术方法AwsClient。您可以看到the PHP docs有关此魔术方法的完整信息,但基本上当您调用对象上不存在的任何方法时,如果其类实现::__call(),则{{1}将被调用。

现在我们在::__call()内(您可以看到代码here),此方法最终会调用::__call()Inside of ::getCommand()你可以看到方法签名需要传入一个数组(第一个参数::__call(),是唯一的其他方法参数,它将具有值{{1因为上面实现了::getCommand()的方式)。这就是第一个问题出现的地方:你需要传入一个数组,而不是单个字符串或时间戳或其他任何东西。

但还有另外一件事;您要调用的实际方法不是$name,而是"create_invalidation"。 SDK here有完整的API文档 - 请确保选择正确的版本。对于我正在查看的版本,您可以找到用于创建失效的API文档和方法签名here

您可以在项目GitHub readme中找到有关AWS PHP SDK的大量信息,包括指向用户指南,API文档等的链接。祝你好运,编码愉快:)。