Аргумент 2, передаваемый AwsAwsClient:: getCommand (), должен иметь тип array, string given


Я следил за установкой с этой страницы .

Которая является версией 3 SDK. Основное использование здесь .

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

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

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

Согласно этой статье.

Уловимая фатальная ошибка: Аргумент 2 передается в AwsAwsClient:: getCommand() должен иметь тип array, string given, приглашать /Пользователи/Джейсон/ВСП/АРМ/поставщика/АРМ/АРМ-СДК-РНР/ГРЦ/AwsClient.php on line 167 и определяется в /Пользователи/Джейсон/ВСП/АРМ/поставщика/АРМ/АРМ-СДК-РНР/ГРЦ/AwsClient.php on line 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);
1 9

1 ответ:

Я взглянул на то, что здесь происходит, и, по-видимому, вы используете недопустимую сигнатуру метода.

Прежде всего, AWS PHP SDK использует нечто под названием "модели описания служб" для получения интерфейса API для указанной вами версии. В данном случае это означает, что они используют некоторые методы метапрограммирования, чтобы обеспечить интерфейс для того, что выглядит как обычные вызовы функций PHP, но функции не жестко закодированы в SDK. Они на самом деле не существуют в том смысле, в котором мы обычно думайте, по крайней мере, не как обычные функции PHP. Какая-то магия PHP происходит внизу.

При вызове $cdn->create_invalidation() он запускается на экземпляре Aws\CloudFront\CloudFrontClient, который наследует от Aws\AwsClient. Ни один из этих классов (ни один из их предков) на самом деле не имеет реализации метода ::create_invalidation(). Но AwsClient реализует волшебный метод PHP ::__call(). Вы можете посмотреть PHP docs для полной информации об этом волшебном методе, но в основном, когда вы вызываете любой метод, который не существует на объекте, если его класс реализует ::__call(), то вместо этого будет вызван ::__call().

Итак, теперь мы внутри ::__call() (Вы можете увидеть код здесь), и этот метод заканчивается вызовом ::getCommand(). внутри ::getCommand() Вы можете видеть, что сигнатура метода требует, чтобы массив был передан (первый аргумент, $name, является единственным другим параметром метода, и он будет иметь значение "create_invalidation" из-за способа ::__call() был реализован выше). Вот тут-то и возникает первая проблема: вам нужно пройти внутрь массив, а не отдельные строки или метки времени или что-то еще.

Но есть еще одна вещь; фактический метод, который вы хотите вызвать, называется не create_invalidation, а createInvalidation. Здесь есть полные документы API для SDK - просто убедитесь, что вы выбрали правильную версию. Для версии, которую я рассматриваю, вы можете найти API docs и подпись метода для создания недействительности здесь.

Вы можете найти много информации о AWS PHP SDK, включая ссылки на руководство пользователя, API Docs, и многое другое, в проекте GitHub readme. Удачи и счастливого кодирования:)