2015-09-22 15 views
9

Śledziłem instalację od this page.Argument 2 przekazany do Aws AwsClient :: getCommand() musi należeć do tablicy typów, łańcuch podany

Co to jest wersja 3 zestawu SDK. Podstawowe użycie 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(), "/*"); 

Zgodnie z this article.

Catchable fatal error: Argument 2 passed to Aws\AwsClient::getCommand() must be of the type array, string given, called in /Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php on line 167 and defined in /Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php on line 211

AKTUALIZACJA & roztwór roboczy TUTAJ:

$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

Chciałbym znać odpowiedź na to pytanie. Dostaję to samo i nie mogę tego rozgryźć. – Claude

Odpowiedz

2

I przyjrzał się temu, co dzieje się tu i widocznie używasz nieprawidłowy podpis metody.

Przede wszystkim pakiet SDK programu AWS korzysta z czegoś, co nazywa się "modelami opisów usług", aby uzyskać interfejs API dla określonej wersji. W tym przypadku oznacza to, że używają pewnych technik meta-programowania, aby zapewnić interfejs do czegoś, co wygląda jak normalne wywołania funkcji PHP, ale funkcje nie są zakodowane w SDK. Tak naprawdę nie istnieją w tym sensie, o którym ogólnie myślimy, a przynajmniej nie są to zwykłe funkcje PHP. Trochę magii PHP dzieje się pod spodem.

Po wywołaniu $cdn->create_invalidation() działa na instancji Aws\CloudFront\CloudFrontClient, która dziedziczy po Aws\AwsClient. Żadna z tych klas (ani żaden z ich przodków) nie ma implementacji metody ::create_invalidation(). Ale AwsClient implementuje magiczną metodę PHP ::__call(). Możesz zobaczyć the PHP docs dla pełnej informacji o tej magicznej metodzie, ale w zasadzie, gdy wywołasz dowolną metodę, która nie istnieje na obiekcie, jeśli jego klasa implementuje ::__call(), wówczas zostanie wywołana ::__call().

Teraz jesteśmy wewnątrz ::__call() (można zobaczyć kod here) i ta metoda kończy się wywoływanie ::getCommand(). widać, że sygnatura metody wymaga przekazania tablicy (pierwszy argument, $name, jest jedynym innym parametrem metody i będzie miał wartość "create_invalidation" ze względu na sposób implementacji powyższego ::__call()). I tu pojawia się pierwszy problem: musisz podać tablicę, a nie pojedyncze ciągi znaków, znaczniki czasu czy cokolwiek innego.

Ale jest jeszcze jedna rzecz; właściwa metoda, którą chcesz wywołać, nie jest nazywana create_invalidation, ale createInvalidation. Istnieją pełne dokumenty API dla SDK here - tylko upewnij się, że wybrałeś odpowiednią wersję. W przypadku wersji, której szukam, możesz znaleźć dokumentację interfejsu API i sygnaturę metody do tworzenia poprawek here.

Możesz znaleźć wiele informacji o AWS PHP SDK, w tym linki do Podręcznika użytkownika, Dokumentów API i nie tylko, w projekcie GitHub readme. Powodzenia i szczęśliwego kodowania :)

+1

Wpadłem na http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=AmazonCloudFront/create_invalidation, skąd pochodzi. – Jason

+0

Tak, to zdecydowanie dziwne; prawdopodobnie przestarzały, a ktoś nie zdawał sobie sprawy z tego, że jest to błędne (i błędne) w obecnym pakiecie SDK PHP, lub jestem pewien, że wysłaliby zawiadomienie gdzieś, że jest nowa lokalizacja dla najnowszych dokumentów wersji SDK. W każdym razie, jeśli przejdziesz na https://aws.amazon.com/ (bardzo na dole strony, link "PHP na AWS" pod "Zasoby i szkolenia") lub https: //aws.amazon.com/tools/("Dokumentacja", pod "PHP"), wtedy otrzymasz link do właściwej strony, którą możesz przejść do http://docs.aws.amazon.com/aws-sdk-php/ v3/api/class-Aws.CloudFront.CloudFrontClient.html. –

+0

Dlaczego nie możesz odpowiedzieć ** co robić **? –

Powiązane problemy