首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递给Aws\AwsClient::getCommand()的参数2必须是类型数组,字符串给定

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

Stack Overflow用户
提问于 2015-09-22 14:33:15
回答 1查看 5.3K关注 0票数 12

我跟踪了此页的安装。

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

代码语言:javascript
复制
<?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(), "/*");

根据这篇文章的说法。

可捕获的致命错误:传递给Aws\AwsClient::getCommand()的参数2必须是类型数组,字符串给定,在第167行的/Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php中调用,在第211行的/Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php中定义

更新和工作解决方案如下:

代码语言:javascript
复制
$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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-28 16:06:00

我看了一下这里发生了什么,很明显,您使用的是无效的方法签名。

首先,AWS使用所谓的“服务描述模型”来获得您指定的版本的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的信息,包括指向用户指南、API等的链接。祝好运和愉快的编码:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32719717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档