Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Penangan dan middleware diAWS SDK for PHPVersi 3
Mekanisme utama untuk memperpanjangAWS SDK for PHPadalah melaluiHandlerdanmiddleware. Setiap kelas klien SDK memilikiAws\HandlerList
contoh yang dapat diakses melaluigetHandlerList()
metode klien. Anda dapat mengambil klienHandlerList
dan memodifikasinya untuk menambah atau menghapus perilaku klien.
Handler
Sebuah handler adalah fungsi yang melakukan transformasi aktual dari perintah dan permintaan menjadi hasil. Sebuah handler biasanya mengirimkan permintaan HTTP. Penangan dapat disusun dengan middleware untuk menambah perilaku mereka. Sebuah handler adalah fungsi yang menerimaAws\CommandInterface
danPsr\Http\Message\RequestInterface
dan mengembalikan janji yang dipenuhi denganAws\ResultInterface
atau ditolak denganAws\Exception\AwsException
Alasan.
Berikut adalah handler yang mengembalikan hasil tiruan yang sama untuk setiap panggilan.
use Aws\CommandInterface; use Aws\Result; use Psr\Http\Message\RequestInterface; use GuzzleHttp\Promise; $myHandler = function (CommandInterface $cmd, RequestInterface $request) { $result = new Result(['foo' => 'bar']); return Promise\promise_for($result); };
Anda kemudian dapat menggunakan handler ini dengan klien SDK dengan menyediakanhandler
pilihan dalam konstruktor klien.
// Set the handler of the client in the constructor $s3 = new Aws\S3\S3Client([ 'region' => 'us-east-1', 'version' => '2006-03-01', 'handler' => $myHandler ]);
Anda juga dapat mengubah handler klien setelah dibangun menggunakansetHandler
metodeAws\ClientInterface
.
// Set the handler of the client after it is constructed $s3->getHandlerList()->setHandler($myHandler);
catatan
Untuk mengubah handler klien multi-region setelah dibangun, gunakanuseCustomHandler
metodeAws\MultiRegionClient
.
$multiRegionClient->useCustomHandler($myHandler);
Handler Mock
Sebaiknya gunakanMockHandler
saat menulis tes yang menggunakan SDK. Anda dapat menggunakanAws\MockHandler
untuk mengembalikan hasil yang diejek atau membuang pengecualian tiruan. Anda enqueue hasil atau pengecualian, dan MockHandler dequeues mereka dalam urutan FIFO.
use Aws\Result; use Aws\MockHandler; use Aws\DynamoDb\DynamoDbClient; use Aws\CommandInterface; use Psr\Http\Message\RequestInterface; use Aws\Exception\AwsException; $mock = new MockHandler(); // Return a mocked result $mock->append(new Result(['foo' => 'bar'])); // You can provide a function to invoke; here we throw a mock exception $mock->append(function (CommandInterface $cmd, RequestInterface $req) { return new AwsException('Mock exception', $cmd); }); // Create a client with the mock handler $client = new DynamoDbClient([ 'region' => 'us-west-2', 'version' => 'latest', 'handler' => $mock ]); // Result object response will contain ['foo' => 'bar'] $result = $client->listTables(); // This will throw the exception that was enqueued $client->listTables();
Middleware
Middleware adalah tipe khusus dari fungsi tingkat tinggi yang menambah perilaku mentransfer perintah, dan mendelegasikan ke handler “berikutnya”. fungsi Middleware menerimaAws\CommandInterface
danPsr\Http\Message\RequestInterface
dan kembalilah janji yang dipenuhi denganAws\ResultInterface
atau ditolak denganAws\Exception\AwsException
Alasan.
Middleware adalah fungsi higher-order yang memodifikasi perintah, permintaan, atau hasil saat melewati middleware. Sebuah middleware mengambil bentuk berikut.
use Aws\CommandInterface; use Psr\Http\Message\RequestInterface; $middleware = function () { return function (callable $handler) use ($fn) { return function ( CommandInterface $command, RequestInterface $request = null ) use ($handler, $fn) { // Do something before calling the next handler // ... $promise = $fn($command, $request); // Do something in the promise after calling the next handler // ... return $promise; }; }; };
Sebuah middleware menerima perintah untuk mengeksekusi dan objek permintaan opsional. Middleware dapat memilih untuk menambah permintaan dan perintah atau membiarkannya apa adanya. Sebuah middleware kemudian memanggil pegangan berikutnya dalam rantai atau dapat memilih untuk hubungan pendek handler berikutnya dan mengembalikan janji. Promise yang dibuat dengan menerapkan handler berikutnya kemudian dapat ditambah menggunakanthen
metode promise untuk memodifikasi hasil akhirnya atau kesalahan sebelum mengembalikan promise back up tumpukan middleware.
HandlerList
SDK menggunakanAws\HandlerList
untuk mengelola middleware dan penangan yang digunakan saat menjalankan perintah. Setiap klien SDK memilikiHandlerList
, dan iniHandlerList
dikloning dan ditambahkan ke setiap perintah yang dibuat klien. Anda dapat melampirkan middleware dan handler default untuk digunakan untuk setiap perintah yang dibuat oleh klien dengan menambahkan middleware ke klienHandlerList
. Anda dapat menambahkan dan menghapus middleware dari perintah tertentu dengan memodifikasiHandlerList
dimiliki oleh perintah tertentu.
SEBUAHHandlerList
merupakan tumpukan middleware yang digunakan untuk membungkuspengurus. Untuk membantu mengelola daftar middleware dan urutan di mana mereka membungkus handler,HandlerList
memecah tumpukan middleware menjadi langkah-langkah bernama yang mewakili bagian dari siklus hidup mentransfer perintah:
-
init
- Tambahkan parameter default -
validate
- Validasi parameter yang diperlukan -
build
- Serialisasi permintaan HTTP untuk mengirim -
sign
- Tanda tangani permintaan HTTP serial -
<handler>(bukan langkah, tetapi melakukan transfer yang sebenarnya)
- init
-
Langkah siklus hidup ini mewakili inisialisasi perintah, dan permintaan belum serial. Langkah ini biasanya digunakan untuk menambahkan parameter default ke perintah.
Anda dapat menambahkan middleware ke
init
langkah menggunakanappendInit
danprependInit
, tempatappendInit
menambahkan middleware ke akhirprepend
daftar sementaraprependInit
menambahkan middleware ke depanprepend
Daftar.use Aws\Middleware; $middleware = Middleware::tap(function ($cmd, $req) { // Observe the step }); // Append to the end of the step with a custom name $client->getHandlerList()->appendInit($middleware, 'custom-name'); // Prepend to the beginning of the step $client->getHandlerList()->prependInit($middleware, 'custom-name');
- mengesahkan
-
Langkah siklus hidup ini digunakan untuk memvalidasi parameter masukan perintah.
Anda dapat menambahkan middleware ke
validate
langkah menggunakanappendValidate
danprependValidate
, tempatappendValidate
menambahkan middleware ke akhirvalidate
daftar sementaraprependValidate
menambahkan middleware ke depanvalidate
Daftar.use Aws\Middleware; $middleware = Middleware::tap(function ($cmd, $req) { // Observe the step }); // Append to the end of the step with a custom name $client->getHandlerList()->appendValidate($middleware, 'custom-name'); // Prepend to the beginning of the step $client->getHandlerList()->prependValidate($middleware, 'custom-name');
- build
-
Langkah siklus hidup ini digunakan untuk membuat serial permintaan HTTP untuk perintah yang sedang dijalankan. Peristiwa siklus hidup hilir akan menerima perintah dan permintaan HTTP PSR-7.
Anda dapat menambahkan middleware ke
build
langkah menggunakanappendBuild
danprependBuild
, tempatappendBuild
menambahkan middleware ke akhirbuild
daftar sementaraprependBuild
menambahkan middleware ke depanbuild
Daftar.use Aws\Middleware; $middleware = Middleware::tap(function ($cmd, $req) { // Observe the step }); // Append to the end of the step with a custom name $client->getHandlerList()->appendBuild($middleware, 'custom-name'); // Prepend to the beginning of the step $client->getHandlerList()->prependBuild($middleware, 'custom-name');
- tanda tangan
-
Langkah siklus hidup ini biasanya digunakan untuk menandatangani permintaan HTTP sebelum dikirim melalui kabel. Anda biasanya harus menahan diri dari mutasi permintaan HTTP setelah ditandatangani untuk menghindari kesalahan tanda tangan.
Ini adalah langkah terakhir dalam
HandlerList
sebelum permintaan HTTP ditransfer oleh handler.Anda dapat menambahkan middleware ke
sign
langkah menggunakanappendSign
danprependSign
, tempatappendSign
menambahkan middleware ke akhirsign
daftar sementaraprependSign
menambahkan middleware ke depansign
Daftar.use Aws\Middleware; $middleware = Middleware::tap(function ($cmd, $req) { // Observe the step }); // Append to the end of the step with a custom name $client->getHandlerList()->appendSign($middleware, 'custom-name'); // Prepend to the beginning of the step $client->getHandlerList()->prependSign($middleware, 'custom-name');
Middleware yang tersedia
SDK menyediakan beberapa middleware yang dapat Anda gunakan untuk menambah perilaku klien atau untuk mengamati eksekusi perintah.
MapCommand
KlasterAws\Middleware::mapCommand
middleware berguna ketika Anda perlu memodifikasi perintah sebelum perintah serial sebagai permintaan HTTP. Misalnya,mapCommand
dapat digunakan untuk melakukan validasi atau menambahkan parameter default. KlastermapCommand
fungsi menerima callable yang menerimaAws\CommandInterface
objek dan mengembalikanAws\CommandInterface
objek.
use Aws\Middleware; use Aws\CommandInterface; // Here we've omitted the require Bucket parameter. We'll add it in the // custom middleware. $command = $s3Client->getCommand('HeadObject', ['Key' => 'test']); // Apply a custom middleware named "add-param" to the "init" lifecycle step $command->getHandlerList()->appendInit( Middleware::mapCommand(function (CommandInterface $command) { $command['Bucket'] = 'mybucket'; // Be sure to return the command! return $command; }), 'add-param' );
MapRequest
KlasterAws\Middleware::mapRequest
middleware berguna ketika Anda perlu memodifikasi permintaan setelah serial tapi sebelum dikirim. Misalnya, ini dapat digunakan untuk menambahkan header HTTP khusus ke permintaan. KlastermapRequest
fungsi menerima callable yang menerimaPsr\Http\Message\RequestInterface
argumen dan mengembalikanPsr\Http\Message\RequestInterface
objek.
use Aws\Middleware; use Psr\Http\Message\RequestInterface; // Create a command so that we can access the handler list $command = $s3Client->getCommand('HeadObject', [ 'Key' => 'test', 'Bucket' => 'mybucket' ]); // Apply a custom middleware named "add-header" to the "build" lifecycle step $command->getHandlerList()->appendBuild( Middleware::mapRequest(function (RequestInterface $request) { // Return a new request with the added header return $request->withHeader('X-Foo-Baz', 'Bar'); }), 'add-header' );
Sekarang ketika perintah dijalankan, itu dikirim dengan header kustom.
penting
Perhatikan bahwa middleware ditambahkan ke daftar handler di akhirbuild
langkah. Hal ini untuk memastikan bahwa permintaan telah dibangun sebelum middleware ini dipanggil.
MapResult
KlasterAws\Middleware::mapResult
middleware berguna ketika Anda perlu memodifikasi hasil eksekusi perintah. KlastermapResult
fungsi menerima callable yang menerimaAws\ResultInterface
argumen dan mengembalikanAws\ResultInterface
objek.
use Aws\Middleware; use Aws\ResultInterface; $command = $s3Client->getCommand('HeadObject', [ 'Key' => 'test', 'Bucket' => 'mybucket' ]); $command->getHandlerList()->appendSign( Middleware::mapResult(function (ResultInterface $result) { // Add a custom value to the result $result['foo'] = 'bar'; return $result; }) );
Sekarang ketika perintah dijalankan, hasil yang dikembalikan akan berisifoo
atribut.
riwayat
Klasterhistory
middleware berguna untuk menguji bahwa SDK menjalankan perintah yang Anda harapkan, mengirim permintaan HTTP yang Anda harapkan, dan menerima hasil yang Anda harapkan. Ini pada dasarnya adalah middleware yang bertindak mirip dengan sejarah browser web.
use Aws\History; use Aws\Middleware; $ddb = new Aws\DynamoDb\DynamoDbClient([ 'version' => 'latest', 'region' => 'us-west-2' ]); // Create a history container to store the history data $history = new History(); // Add the history middleware that uses the history container $ddb->getHandlerList()->appendSign(Middleware::history($history));
SesiAws\History
sejarah kontainer menyimpan 10 entri secara default sebelum membersihkan entri. Anda dapat menyesuaikan jumlah entri dengan meneruskan jumlah entri untuk bertahan ke konstruktor.
// Create a history container that stores 20 entries $history = new History(20);
Anda dapat memeriksa wadah sejarah setelah mengeksekusi permintaan yang lulus middleware sejarah.
// The object is countable, returning the number of entries in the container count($history); // The object is iterable, yielding each entry in the container foreach ($history as $entry) { // You can access the command that was executed var_dump($entry['command']); // The request that was serialized and sent var_dump($entry['request']); // The result that was received (if successful) var_dump($entry['result']); // The exception that was received (if a failure occurred) var_dump($entry['exception']); } // You can get the last Aws\CommandInterface that was executed. This method // will throw an exception if no commands have been executed. $command = $history->getLastCommand(); // You can get the last request that was serialized. This method will throw an exception // if no requests have been serialized. $request = $history->getLastRequest(); // You can get the last return value (an Aws\ResultInterface or Exception). // The method will throw an exception if no value has been returned for the last // executed operation (e.g., an async request has not completed). $result = $history->getLastReturn(); // You can clear out the entries using clear $history->clear();
keran
Klastertap
middleware digunakan sebagai pengamat. Anda dapat menggunakan middleware ini untuk memanggil fungsi saat mengirim perintah melalui rantai middleware. Klastertap
fungsi menerima callable yang menerimaAws\CommandInterface
dan opsionalPsr\Http\Message\RequestInterface
yang sedang dieksekusi.
use Aws\Middleware; $s3 = new Aws\S3\S3Client([ 'region' => 'us-east-1', 'version' => '2006-03-01' ]); $handlerList = $s3->getHandlerList(); // Create a tap middleware that observes the command at a specific step $handlerList->appendInit( Middleware::tap(function (CommandInterface $cmd, RequestInterface $req = null) { echo 'About to send: ' . $cmd->getName() . "\n"; if ($req) { echo 'HTTP method: ' . $request->getMethod() . "\n"; } } );
Membuat handler kustom
Sebuah handler hanyalah sebuah fungsi yang menerimaAws\CommandInterface
objek danPsr\Http\Message\RequestInterface
objek, dan mengembalikanGuzzleHttp\Promise\PromiseInterface
yang dipenuhi denganAws\ResultInterface
atau ditolak denganAws\Exception\AwsException
.
Meskipun SDK memiliki beberapa@http
pilihan, handler hanya perlu tahu bagaimana menggunakan pilihan berikut:
-
decode_content(opsional)
-
kemajuan(opsional)
-
sinkron(opsional)
-
aliran(opsional)
-
http_stats_receiver (opsional) - Sebuah fungsi untuk memohon dengan array asosiatif statistik transfer HTTP jika diminta menggunakanstatistikparameter konfigurasi.
Kecuali opsi ditentukan sebagai opsional, handler HARUS dapat menangani opsi atau HARUS mengembalikan janji yang ditolak.
Selain penanganan spesifik@http
pilihan, handler HARUS menambahkanUser-Agent
header yang mengambil bentuk berikut, di mana “3.X” dapat diganti denganAws\Sdk::VERSION
dan”HandlerSpecificData/version...” harus diganti dengan string User-Agent khusus handler Anda.
User-Agent: aws-sdk-php/3.X HandlerSpecificData/version ...