传递给AwsAwsClient::getCommand()的参数2必须是array, string类型


Argument 2 passed to AwsAwsClient::getCommand() must be of the type array, string given

我从这个页面开始安装。

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

<?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(), "/*");

根据本文

可捕获致命错误:参数2传递给Aws'AwsClient::getCommand()的类型必须是array, string given,在/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

更新,

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

我看了一下这里发生了什么,显然你使用了无效的方法签名。

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

当你调用$cdn->create_invalidation()时,它运行在从Aws'AwsClient继承的Aws'CloudFront'CloudFrontClient实例上。这两个类(以及它们的祖先类)实际上都没有::create_invalidation()方法实现。但是AwsClient确实实现了PHP的魔法方法::__call()。你可以在PHP文档中看到这个神奇方法的完整信息,但基本上当你调用对象上不存在的任何方法时,如果它的类实现了::__call(),那么::__call()将被调用。

现在我们在::__call()内部(你可以在这里看到代码),这个方法最终调用::getCommand()。在::getCommand()内部,您可以看到方法签名需要传入一个数组(第一个参数$name是唯一的其他方法参数,由于上面实现::__call()的方式,它的值将为"create_invalidation")。这就是第一个问题出现的地方:你需要传入一个数组,而不是单独的字符串或时间戳或其他任何东西。

但是还有一件事;您想要调用的实际方法不是create_invalidation,而是createInvalidation。这里有SDK的完整API文档——只要确保你选择了正确的版本。对于我正在寻找的版本,您可以在这里找到用于创建无效的API文档和方法签名。

你可以在项目的GitHub自述中找到很多关于AWS PHP SDK的信息,包括用户指南、API文档等的链接。祝你好运和快乐编码:)