Dalam siri sebelumnya, kami membina pelanggan PHP untuk Diffbot. Pelanggan berfungsi dengan baik dan menggunakan penggunaan yang agak meluas - kami juga mengujinya pada aplikasi langsung untuk memastikan ia sampai setanding - tetapi ia sangat bergantung pada Guzzle 5.
Guzzle 6 keluar, dan menyokong PSR 7. Walaupun pengarang Guzzle Tuntutan Guzzle 5 akan disokong untuk masa depan yang dijangka, lebih selamat untuk skeptikal panjang umurnya. Selain itu, sementara PSR 7 mungkin mempunyai kebiasaannya, adalah baik untuk mengikuti PSR jika hanya untuk keserasian dengan projek lain
NOTA: Anda tidak perlu akrab dengan logik dalaman SDK Diffbot untuk diikuti. Proses dalam artikel ini boleh digunakan untuk mana -mana pakej dengan pelaksanaan klien HTTP konkrit dan mudah diikuti.
php-http dan httplug php-http adalah organisasi GitHub untuk alat berkaitan HTTP dalam PHP. Ia menyediakan HTTPLUG, koleksi antara muka dan pengecualian untuk menentukan kontrak klien HTTP yang minimum di atas permintaan dan tindak balas PSR-7. Pelaksanaan kontrak ini
menyediakanIni bermakna seseorang yang menggunakan Guzzle 6 boleh komposer memerlukan php-http/guzzle6-adapter untuk menarik penyesuai, pakej antara muka httplug, dan Guzzle 6 sendiri sebagai kebergantungan penyesuai.
Httplug adalah titik masuk untuk pakej yang boleh diguna semula. Ia adalah abstraksi pelanggan semua pelanggan (seperti penyesuai Guzzle6) berdasarkan. Pelanggan -pelanggan ini kemudian menggunakan pakej / kebergantungan asas mereka - Guzzle 6 dalam kes ini.
jadi, bawah ke atas:
Pelan pasukan adalah untuk akhirnya mendapat sokongan maksimum untuk semua pelanggan HTTP di PHP Land: Guzzle 6, Guzzle 5, Zend2, Zend1, dan lain -lain. Versi pelanggan, dan hanya akan memasukkan penyesuai yang sesuai ke dalam campuran.
Perhatikan bahawa kami menggunakan istilah penyesuai dan klien di sini hampir secara bergantian - penyesuai berdasarkan httplug adalah kedua -duanya. Mereka adalah pembungkus di sekitar pelanggan sedia ada, tetapi digunakan secara langsung sebagai pelanggan sendiri.
Pelan kami dalam jawatan ini adalah untuk menggantikan Guzzle Concrete 5 Ketergantungan Pelanggan PHP DiffBot dengan versi HTTPLUG.
NOTA: Pakej Httplug dan berkaitan adalah perisian Alpha, dan oleh itu tertakluk kepada perubahan. Menukar apa sahaja untuk menggunakannya adalah usaha yang berisiko.
Seperti biasa, disarankan kami menggunakan Homestead yang lebih baik untuk bootstrap persekitaran kita. Sebaik sahaja kita sudah bersedia, kita boleh mengklon dan menguji versi stabil semasa SDK:
git clone https://github.com/swader/diffbot-php-client cd diffbot-php-client git checkout tags/0.4.5 composer install phpunit
Perintah terakhir menganggap phpunit dipasang secara global pada persekitaran pembangunan.
semua ujian harus lulus (kecuali untuk dilangkau yang diserang dan tidak dapat dipertahankan kerana beberapa karut), jadi kami bersedia untuk memulakan penukaran.
Pertama, kita perlu membuat cawangan baru untuk membangunkan peningkatan ini.
git checkout -b feature-httplug
Kemudian, kami menambah dua kebergantungan ke dalam fail komposer.json kami:
git clone https://github.com/swader/diffbot-php-client cd diffbot-php-client git checkout tags/0.4.5 composer install phpunit
Apa ini adalah memberitahu pelanggan bahawa mulai sekarang, ia bergantung kepada pakej maya - yang satu ini. Ini bermakna untuk digunakan, aplikasi menggunakan pelanggan DiffBot kami (seperti ini) mesti memilih pelaksanaan pakej ini (salah satu yang disenaraikan di pautan pada pembungkus). Sudah tentu, semasa pembangunan pakej, mustahil untuk menguji dan melihat sama ada semuanya berfungsi tanpa pelaksanaan sebenar, jadi kami menentukan ketergantungan tambahan. Dalam kes tertentu di atas, kami menggunakan "php-http/guzzle6-adapter": "~0.2@dev". Kami memilih versi tertentu semata -mata kerana ia adalah yang terbaru dan tidak ada pelepasan yang stabil.
Nota: Anda mungkin tertanya -tanya mengapa kami menggunakan pendekatan menambah nilai ke dalam komposer.json dan bukannya mengisytiharkan kebergantungan secara interaktif di terminal seperti yang biasanya kita lakukan. Ini kerana melakukan komposer yang memerlukan pada pakej maya akan membuang ralat - pakej tidak benar -benar wujud, itu hanya nama maya, pemegang tempat, jadi komposer akan keliru tanpa mengetahui apa yang harus dipasang. Terdapat masalah yang mencadangkan perubahan ini, tetapi ia tidak mungkin berlaku tidak lama lagi.
Oleh kerana pakej php-http masih dalam perkembangan berat, kita harus menambah dua nilai berikut kepada fail komposer.json kami:
git checkout -b feature-httplug
Ini adalah untuk membolehkan pemasangan pakej dev (tidak stabil), tetapi akan lebih suka versi yang stabil jika ia wujud. Jadi daripada mengambil, katakan, phpunit 5.2.x yang sangat tidak stabil, ia akan mengambil 5.0.8 (paling terkini pada masa penulisan), tetapi ia juga akan berjaya jika kita meminta untuk pakej yang tidak ada Siaran yang stabil (seperti Guzzle6-Adapter).
kita juga perlu mengeluarkan kebergantungan pada Guzzle5, jika kita berhasrat untuk memasang Guzzle6. Akhir memerlukan blok kelihatan seperti ini:
"require": { ... "php-http/client-implementation": "^1.0" }, "require-dev": { ... "php-http/guzzle6-adapter": "~0.2@dev" },
Cara SDK kini berfungsi adalah seperti berikut: Dalam kelas DiffBot utama, kami secara pilihan menetapkan HTTPClient. Ini pada masa ini terikat pada pelaksanaan Guzzle di versi 5. Jika tiada contoh klien tersuai ditetapkan, kelas DiffBot secara automatik menggunakan klien lalai.
Pelanggan ini kemudiannya digunakan oleh kaedah panggilan API Abstrak untuk mengeluarkan permintaan GET ke URL yang diberikan. Di samping itu, terdapat kaedah panggilan tersuai dalam kelas API Crawl dan kelas API carian.
Hasil panggilan disimpan sebagai respons $, yang merupakan respons Guzzle5. Tanggapan itu kemudiannya diproses oleh kilang entiti yang memeriksa kesahihannya dan membina entiti daripadanya, mendorong mereka ke dalam entiti Iterator.
pelan itu, oleh itu, kepada:
Projek PHP-HTTP mempunyai pakej tambahan, UTILS, yang mengandungi httpmethodsclient. Kelas itu membungkus kilang mesej dan klien HTTP ke dalam satu keseluruhan, menjadikannya lebih mudah untuk menghantar permintaan dengan kata kerja yang biasa digunakan seperti Get, Post, dan lain-lain-dengan itu menterjemahkan sesuatu yang serupa dengan apa yang telah kita setakat ini: $ client-> GET (. ..). Lebih-lebih lagi, ia juga mengembalikan PSR-7 ResponseInterface, yang bermaksud kaedah Getbody akan tersedia kepada kami-yang hanya akan meninggalkan kaedah Tojson yang tidak diletakkan, sesuatu yang boleh kita lakukan dengan mudah.
Selain itu, projek ini mempunyai komponen penemuan, yang menampilkan beberapa kelas statik untuk menemui kilang dan pelanggan yang dipasang-ini membolehkan kami menyediakan pengguna akhir kami dengan pengalaman sifar-konfigurasi dalam beberapa kes (lihat DOCS).Dengan pelan pertempuran yang dibentangkan, kita boleh memulakan dengan refactoring.
Prasyarat
git clone https://github.com/swader/diffbot-php-client cd diffbot-php-client git checkout tags/0.4.5 composer install phpunit
git checkout -b feature-httplug
"require": { ... "php-http/client-implementation": "^1.0" }, "require-dev": { ... "php-http/guzzle6-adapter": "~0.2@dev" },
Kaedah harus refactored ke:
Sebagai alternatif, kelas penemuan boleh diimport dengan pernyataan penggunaan di bahagian atas kelas.
"prefer-stable": true, "minimum-stability": "dev"
Perubahan ini kini membolehkan pengguna akhir SDK diffbot sama ada:
Mempunyai pelanggan mereka sendiri dipasang dan biarkan komponen penemuan sejajar dengan httpmethodsclient menjaga perkara secara automatik, atau
API Abstrak, merangkak dan cari
Oleh kerana contoh httpmethodsclient yang kami lakukan sebelum ini mempunyai kaedah GET, tidak ada perubahan yang diperlukan dalam hal itu. Walau bagaimanapun, contoh tindak balas $ menunjukkan mistmatch, dan dengan alasan yang baik. Sambutan $ asal yang dijangkakan oleh EntityFactory adalah tindak balas Guzzle5.
Oleh kerana aduan yang dikeluarkan oleh EntityFactory, kami tidak perlu mengedit API Abstrak - ia akan menjaga perkara sendiri. Rakan panggilan kelas Crawl 'agak berbeza:
git clone https://github.com/swader/diffbot-php-client cd diffbot-php-client git checkout tags/0.4.5 composer install phpunit
Dua amaran di sini - baris kedua kaedah yang menggunakan kaedah JSON $ respons, dan Instansiation EntityIterator yang mengharapkan tindak balas Guzzle5. Satu -satunya baris yang kita boleh menjejaskan dari sini adalah bekas, jadi mari kita ubahnya ke:
git checkout -b feature-httplug
Perubahan yang sama perlu dilakukan dalam kaedah panggilan kelas carian, di mana garis:
"require": { ... "php-http/client-implementation": "^1.0" }, "require-dev": { ... "php-http/guzzle6-adapter": "~0.2@dev" },
berubah menjadi:
"prefer-stable": true, "minimum-stability": "dev"
Kelas EntityFactory mempunyai import berikut di bahagian atas:
"require": { "php" : ">=5.4.0", "php-http/client-implementation": "^1.0" }, "require-dev": { "symfony/var-dumper": "~2", "phpunit/phpunit": "^5.0", "php-http/guzzle6-adapter": "~0.2@dev" },
kita boleh mengubahnya menjadi:
composer require "php-http/utils" "php-http/discovery"
yang sama perlu dilakukan di antara muka EntityFactory yang melaksanakan kelas EntityFactory.
Perubahan lain adalah serupa dengan apa yang kita lakukan di atas, dalam kelas merangkak. Kami menukar:
use GuzzleHttp\Client;
use Http\Client\Utils\HttpMethodsClient as Client;
entiti iterator
to
<span>/** </span><span> * Sets the client to be used for querying the API endpoints </span><span> * </span><span> * <span>@param Client $client </span></span><span> * <span>@see http://php-http.readthedocs.org/en/latest/utils/#httpmethodsclient </span></span><span> * <span>@return $this </span></span><span> */ </span><span>public function setHttpClient(Client $client = null) </span><span>{ </span> <span>if ($client === null) { </span> <span>$client = new Client( </span> <span><span>\Http\Discovery\HttpClientDiscovery</span>::find(), </span> <span><span>\Http\Discovery\MessageFactoryDiscovery</span>::find() </span> <span>); </span> <span>} </span> <span>$this->client = $client; </span> <span>return $this; </span><span>} </span>
ujian
<span>public function call() </span><span>{ </span> <span>$response = $this->diffbot->getHttpClient()->get($this->buildUrl()); </span> <span>$array = $response->json(); </span> <span>if (isset($array['jobs'])) { </span> <span>$jobs = []; </span> <span>foreach ($array['jobs'] as $job) { </span> <span>$jobs[] = new JobCrawl($job); </span> <span>} </span> <span>return new EntityIterator($jobs, $response); </span> <span>} elseif (!isset($array['jobs']) && isset($array['response'])) { </span> <span>return $array['response']; </span> <span>} else { </span> <span>throw new DiffbotException('It appears something went wrong.'); </span> <span>} </span><span>} </span>
Oleh kerana tutorial ini sudah sedikit di sisi panjang, sila lihat cawangan ciri yang relevan jika anda berminat untuk mempelajari perbezaan dalam mengejek antara Guzzle 5 dan Guzzle 6 dan, khususnya, antara dua versi SDK Diffbot .
Akhirnya, mari kita jalankan ujian:
kejayaan! Semua lulus (kecuali ujian yang dilangkau).
$array = json_decode($response->getBody(), true);
DiffBot SDK kini bukan sahaja serasi PSR-7, tetapi juga menerima pelaksanaan lain pelanggan HTTP. Semua yang diperlukan adalah penyesuai yang menghormati antara muka httplug, dan segala -galanya harus berfungsi dari kotak.
Kesimpulan
Jika anda ingin membantu dengan menambah lebih banyak pelaksanaan penyesuai, atau hanya dengan mencuba pakej dan memberi maklum balas, pasukan mengalu -alukan semua sumbangan. Hubungi, atau tinggalkan maklum balas anda di bahagian komen di bawah, dan jika anda mendapati tutorial ini menarik, jangan lupa untuk memukul butang seperti itu!
Bagaimana saya memasang php http/httplug? Alat Pengurusan Ketergantungan untuk PHP. Anda boleh memasangnya dengan menjalankan komposer perintah memerlukan php-http/httplug. Ini akan memuat turun perpustakaan httplug dan kebergantungannya.
Bagaimana saya mengendalikan respons dengan php http/httplug? diwakili oleh antara muka ResponseInterface. Anda boleh mengakses kod status, tajuk, dan badan respons menggunakan kaedah getStatuscode, getHeaders, dan getbody. 🎜> Komponen penemuan dalam PHP HTTP/HTTPLUG digunakan untuk mencari dan menggunakan penyesuai HTTP dan kilang mesej secara automatik. Ini menjadikannya lebih mudah untuk beralih antara pelanggan HTTP yang berbeza dan menggunakan pelaksanaan terbaik yang tersedia. Memanggil kaedah mencari statik pada kelas HttpClientDiscovery atau MessageFactoryDiscovery. Ini akan mengembalikan contoh klien atau kilang mesej HTTP yang pertama.
Bagaimana saya mengendalikan ralat dalam php http/httplug? Melaksanakan antara muka HttpClientException. Anda boleh menangkap pengecualian ini dan mengendalikannya seperti yang diperlukan. Di samping itu, anda boleh menggunakan errorPlugin untuk menukar respons bukan 200 ke dalam pengecualian secara automatik.
Atas ialah kandungan terperinci Keluarkan dari Guzzle5 dengan php-http dan httplug. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!