2015-09-22 4 views
9

Ho seguito l'installazione da this page.L'argomento 2 passato a Aws AwsClient :: getCommand() deve essere del tipo array, stringa fornita

Qual è la versione 3 dell'SDK. Utilizzo di base 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(), "/*"); 

Secondo 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

AGGIORNATO & SOLUZIONE DI LAVORO QUI:

$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

Mi piacerebbe sapere la risposta a questo. Ho la stessa cosa e non riesco a capirlo. – Claude

risposta

2

ho preso uno sguardo a quello che stava succedendo qui ea quanto pare si sta utilizzando un metodo di firma non valida.

Prima di tutto, l'SDK PHP di AWS utilizza qualcosa chiamato "modelli di descrizione del servizio" per ottenere un'interfaccia API per la versione specificata. In questo caso ciò significa che stanno usando alcune tecniche di meta-programmazione per fornire un'interfaccia a quelle che sembrano normali chiamate alle funzioni PHP, ma le funzioni non sono codificate nell'SDK. Non esistono realmente nel senso in cui generalmente pensiamo, almeno non come normali funzioni PHP. Alcune magie PHP stanno succedendo sotto.

Quando si chiama $cdn->create_invalidation() viene eseguito sull'istanza Aws\CloudFront\CloudFrontClient che eredita da Aws\AwsClient. Nessuna di queste classi (né alcuno dei loro antenati) ha effettivamente un'implementazione del metodo ::create_invalidation(). Ma lo AwsClient implementa il metodo magico PHP ::__call(). Puoi vedere the PHP docs per le informazioni complete su questo metodo magico, ma fondamentalmente quando chiami qualsiasi metodo che non esiste su un oggetto, se la sua classe implementa ::__call(), allora verrà invocato lo ::__call().

Quindi ora siamo all'interno di ::__call() (è possibile vedere il codice here) e questo metodo termina chiamando ::getCommand(). è possibile notare che la firma del metodo richiede l'inoltro di una matrice (il primo argomento, $name, è l'unico parametro del metodo e avrà il valore "create_invalidation" a causa del modo in cui è stato implementato ::__call() in precedenza). Ecco dove si presenta il primo problema: è necessario passare in una matrice, non singole stringhe o timestamp o qualsiasi altra cosa.

Ma c'è un'altra cosa; il metodo effettivo che si desidera chiamare non è chiamato create_invalidation, ma createInvalidation. Esistono documenti API completi per l'SDK here: assicurati di scegliere la versione giusta. Per la versione che sto guardando, puoi trovare i documenti API e la firma del metodo per la creazione di invalidazioni here.

È possibile trovare molte informazioni sull'SDK PHP AWS inclusi i collegamenti a una Guida dell'utente, documenti API e altro, nel progetto GitHub readme. Buona fortuna e felice codifica :)

+1

Ho continuato a correre su http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=AmazonCloudFront/create_invalidation da dove proviene. – Jason

+0

Sì, è decisamente strano; è probabilmente obsoleto e qualcuno non si è reso conto che è fuorviante (e sbagliato) per l'attuale SDK PHP, o sono sicuro che avrebbe messo un avviso da qualche parte che c'era una nuova posizione per i documenti della versione dell'ultima SDK. Ad ogni modo, se vai su https://aws.amazon.com/ (molto in fondo alla pagina, un link "PHP su AWS" sotto "Risorse e formazione"), o https: //aws.amazon.com/tools/("Documentazione", sotto "PHP"), quindi sarai collegato alla pagina corretta, che puoi seguire in http://docs.aws.amazon.com/aws-sdk-php/ v3/api/class-Aws.CloudFront.CloudFrontClient.html. –

+0

Perché non puoi rispondere ** cosa fare **? –

Problemi correlati