Bukankah lebih baik jika kita dapat membangunkan saluran paip yang mudah tetapi dengan keupayaan untuk menambah tugas tambahan kemudian tanpa mengaburkan aliran utama? Artikel ini akan menunjukkan kepada anda bagaimana anda boleh menyesuaikan idea dari WordPress, dan pengaturcaraan secara umum, untuk memberikan API anda keupayaan untuk melakukan interaksi yang lebih kuat.
Takeaways Key
Idea di sebalik cangkuk bukanlah sesuatu yang baru dan tidak dicipta oleh WordPress. Walau bagaimanapun, WordPress melakukan tugas yang baik untuk melaksanakannya semasa kitaran hayat pemprosesan halaman pelayan mereka. Penggunaan cangkuk ini, pada pendapat saya, mungkin merupakan satu -satunya ciri terbesar platform. Dengan cangkuk ini, pengguna boleh menulis fungsi mereka sendiri - sama ada plugin atau tema - yang mengikat ke WordPress dan menjalankan kod apa sahaja yang anda mahu betul apabila diperlukan. Adakah anda perlu mengubah tajuk yang dihantar kepada pengguna? Tidak ada masalah: cangkuk ke acara WP_HEADERS dan anda boleh mengubah tajuk seperti yang anda lihat sesuai.
cangkuk baik untuk banyak perkara, termasuk mencetuskan beberapa tugas sampingan, memanggil sistem lain melalui arahan php curl, membina objek dan memasukkannya ke dalam barisan tugas untuk diambil oleh sistem lain kemudian, menghantar e -mel, Dan banyak lagi. Ini semua boleh dilakukan tanpa perlu awan aliran utama titik akhir yang diberikan (dan mungkin memaksa versi API baru dalam proses).
Jika titik akhir adalah untuk membuat pengguna, kita boleh memberi tumpuan kepada mewujudkan rekod pengguna dalam pangkalan data dan di sepanjang jalan hanya memanggil sesiapa yang sedang mendengar semasa proses itu. Mungkin selepas membuat rekod pengguna, kami menghantar satu acara yang mengatakan "sesiapa yang mendengar ini, saya hanya membuat pengguna dan inilah maklumat mereka". Mungkin beberapa fungsi panggilan balik telah melanggan acara itu dan mendengar atau mungkin tidak ada. Acara itu tidak begitu peduli.
Dengan sistem ini, kita boleh memanggil API kita untuk kod yang mungkin ditulis pada masa yang akan datang. Kita boleh melakukan ini tanpa perlu menyentuh kod titik akhir API itu sendiri. Untuk menunjukkan bagaimana ini berfungsi, mari kita ubah gear dan tunjukkan mekanisme asas bagaimana kita boleh mendapatkan ini bermula dalam API PHP. Perlu diingat bahawa, semasa kami menggunakan PHP di sini, kita sebenarnya boleh melaksanakan logik yang sama dalam aplikasi web menggunakan bahasa lain.
Untuk memulakan, kita perlu menambah cangkuk/tindakan (yang saya akan merujuk sebagai "cangkuk" dari sekarang). Kami juga memerlukan keupayaan untuk mengeluarkan cangkuk dan akhirnya mencetuskan cangkuk. Sebaik sahaja kita menentukan mekanisme ini, kita hanya perlu memastikan ia dimasukkan ke dalam API dan kemudian mencari tempat di API kita di mana kita mungkin mahu memanggil cangkuk ini. Berikut adalah salah satu cara kita mungkin mahu menetapkan ini.
di sini hooks.php:
<span>// Global array which will hold all of our hooks </span><span>// We will reference this array in each function to add/remove/call our hooks </span><span>// The code below should also be seen by any callbacks we write for the system later. </span><span>$hooks = []; </span> <span>// Below are global functions that can be seen from our API code </span><span>// The add_hook method will allow us to attach a function (callback) to a given event name </span><span>function add_hook($event_name, $callback) { </span> <span>global $hooks; </span> <span>if ($callback !== null) { </span> <span>if ($callback) { </span> <span>// We can set up multiple callbacks under a single event name </span> <span>$hooks[$event_name][] = $callback; </span> <span>} </span> <span>} </span><span>} </span> <span>// Super easy to implement, we remove the given hook by its name </span><span>function remove_hook($event_name) { </span> <span>global $hooks; </span> <span>unset($hooks[$event_name]); </span><span>} </span> <span>// When we want to trigger our callbacks, we can call this function </span><span>// with its name and any parameters we want to pass. </span><span>function do_hook($event_name, ...$params) { </span> <span>global $hooks; </span> <span>if (isset($hooks[$event_name])) { </span> <span>// Loop through all the callbacks on this event name and call them (if defined that is) </span> <span>// As we call each callback, we given it our parameters. </span> <span>foreach ($hooks[$event_name] as $function) { </span> <span>if (function_exists($function)) { </span> <span>call_user_func($function, ...$params); </span> <span>} </span> <span>} </span> <span>} </span><span>} </span>
Sekarang bahawa kami mempunyai fail cangkuk.php kami yang dibuat, kita hanya perlu memasukkannya ke dalam API kami supaya fungsi -fungsi ini dapat dilihat. Sebaik sahaja ini selesai, ia hanya satu perkara untuk memasukkan cangkuk ke dalam API kami menggunakan DO_HOOK.
Sebagai contoh mudah, mari kita anggap kita mempunyai API untuk mendaftarkan pengguna baru dengan sistem kami. Kami mungkin mempunyai titik akhir API REST yang dipanggil /AddUser. Atas nama kesederhanaan, mari juga menganggap bahawa matlamat di sini adalah untuk memasukkan nama dan umur pengguna baru ke dalam jadual pengguna pangkalan data kami. Cukup lurus ke hadapan, kan?
<span>// Global array which will hold all of our hooks </span><span>// We will reference this array in each function to add/remove/call our hooks </span><span>// The code below should also be seen by any callbacks we write for the system later. </span><span>$hooks = []; </span> <span>// Below are global functions that can be seen from our API code </span><span>// The add_hook method will allow us to attach a function (callback) to a given event name </span><span>function add_hook($event_name, $callback) { </span> <span>global $hooks; </span> <span>if ($callback !== null) { </span> <span>if ($callback) { </span> <span>// We can set up multiple callbacks under a single event name </span> <span>$hooks[$event_name][] = $callback; </span> <span>} </span> <span>} </span><span>} </span> <span>// Super easy to implement, we remove the given hook by its name </span><span>function remove_hook($event_name) { </span> <span>global $hooks; </span> <span>unset($hooks[$event_name]); </span><span>} </span> <span>// When we want to trigger our callbacks, we can call this function </span><span>// with its name and any parameters we want to pass. </span><span>function do_hook($event_name, ...$params) { </span> <span>global $hooks; </span> <span>if (isset($hooks[$event_name])) { </span> <span>// Loop through all the callbacks on this event name and call them (if defined that is) </span> <span>// As we call each callback, we given it our parameters. </span> <span>foreach ($hooks[$event_name] as $function) { </span> <span>if (function_exists($function)) { </span> <span>call_user_func($function, ...$params); </span> <span>} </span> <span>} </span> <span>} </span><span>} </span>
Kod di atas adalah pandangan yang terlalu sederhana dan umum tentang bagaimana kita boleh menambah pengguna baru. Ideanya ialah, jika seseorang memanggil titik akhir API /Adduser kami, mereka akhirnya akan tiba di fungsi ini di mana nama dan umur pengguna ditarik keluar dari data yang dipaparkan. Kami mula -mula memeriksa untuk memastikan mereka menyiarkan (sebagai peraturan rehat yang betul) dan kemudian cuba masukkan pengguna ke dalam jadual pengguna.
Seterusnya, jika pengguna telah dimasukkan dengan jayanya, kami ingin memanggil cangkuk untuk membiarkan mana -mana kod mendengar bahawa pengguna dibuat (ini sama dengan menaikkan peristiwa dalam bahasa lain).
Beberapa bulan kemudian, kami mempunyai jabatan pemasaran kami yang menegaskan bahawa, apabila pengguna baru dibuat, e -mel harus dihantar dengan butiran pengguna. Kami mungkin cenderung untuk menulis fungsi penolong ke dalam API, kemudian panggilnya dari kod titik akhir ini. Hebat ... jika itu semua yang diminta. Tetapi bagaimana jika pasukan sokongan kemudian datang kepada anda dan mahu anda juga menambah pengguna ke sistem Zendesk mereka. Oleh itu, anda menulis fungsi lain dan taktik yang memanggil ke titik akhir ini juga.
Perkara seterusnya yang anda tahu, titik akhir ini bukan sahaja menambah pengguna ke pangkalan data laman web kami, tetapi membuat panggilan ke fungsi untuk menghantar e -mel, menambah pengguna ke Zendesk, Jira dan Microsoft Cloud dan kemudian berurusan dengan hasil kejayaan/kegagalan mereka. Semua perkara tambahan ini benar -benar mengambil dari titik yang jelas untuk menambah pengguna ke pangkalan data kami. Kami ingin memanggil satu acara dan mempunyai kod lain hanya mendengar apabila pengguna dibuat dan melakukan perkara mereka sendiri - tanpa kami perlu mengubah suai titik akhir ini. Mungkin tidak ada perkhidmatan lain untuk menambah pengguna baru, jadi tiada siapa yang dipanggil untuk melakukan apa -apa. Titik akhir tidak perlu peduli. Cukup hebat, betul?
mari kita teruskan contoh kita dengan memberikan nama cangkuk kita. Ini adalah nama yang semua kod panggil balik perlu digunakan untuk mendengar. Sekali lagi, bahasa lain merujuk kepada persediaan ini sebagai "peristiwa", jadi pastikan anda melihatnya dalam bahasa yang anda lakukan untuk mengetahui lebih lanjut.
Kami akan memanggil hook tambah_user kami. Mudah dan terus ke titik, tidakkah anda fikir? Sebaik sahaja kita mempunyai nama, kita boleh menentukan di mana kita mahu memanggil cangkuk ini. Saya fikir selepas sisipan yang berjaya akan menjadi idea yang baik:
<span>// POST endpoint for adding a user (part of a larger API class) </span><span>public function addUser($name, $age) { </span> <span>if ($this->request->method === 'post') { </span> <span>try { </span> <span>$this->db->insert('users', ['name' => $name, 'age' => $age]); </span> <span>return new Response(200, 'User created successfully!'); </span> <span>} catch (Exception $e) { </span> <span>// Oops, something went wrong. </span> <span>// Do some logging or whatever. </span> <span>} </span> <span>} </span> <span>// If not a POST request, return http status 400 </span> <span>return new Response(400, 'Bad request'); </span><span>} </span>
Sekarang kita boleh mempunyai berpuluh -puluh fungsi panggil balik mendengar cangkuk tambahan atau tidak sama sekali. Mungkin kita mempunyai satu panggilan balik yang bertanggungjawab untuk memasukkan pengguna ke Zendesk dan yang lain yang akan mengambil nama dan umur dan menghasilkan e -mel ke pemasaran. Kod "pelanggan" ini boleh tinggal di tempat lain di codebase, selagi ia dapat melihat kod cangkuk.php di dalam projek API. Saya biasanya meletakkan fungsi panggil balik saya dalam fail berasingan dan memasukkan fail itu ke dalam API juga. Berikut adalah salah satu contoh panggilan balik yang kini boleh memanfaatkan cangkuk baru ini yang kami buat:
<span>// Global array which will hold all of our hooks </span><span>// We will reference this array in each function to add/remove/call our hooks </span><span>// The code below should also be seen by any callbacks we write for the system later. </span><span>$hooks = []; </span> <span>// Below are global functions that can be seen from our API code </span><span>// The add_hook method will allow us to attach a function (callback) to a given event name </span><span>function add_hook($event_name, $callback) { </span> <span>global $hooks; </span> <span>if ($callback !== null) { </span> <span>if ($callback) { </span> <span>// We can set up multiple callbacks under a single event name </span> <span>$hooks[$event_name][] = $callback; </span> <span>} </span> <span>} </span><span>} </span> <span>// Super easy to implement, we remove the given hook by its name </span><span>function remove_hook($event_name) { </span> <span>global $hooks; </span> <span>unset($hooks[$event_name]); </span><span>} </span> <span>// When we want to trigger our callbacks, we can call this function </span><span>// with its name and any parameters we want to pass. </span><span>function do_hook($event_name, ...$params) { </span> <span>global $hooks; </span> <span>if (isset($hooks[$event_name])) { </span> <span>// Loop through all the callbacks on this event name and call them (if defined that is) </span> <span>// As we call each callback, we given it our parameters. </span> <span>foreach ($hooks[$event_name] as $function) { </span> <span>if (function_exists($function)) { </span> <span>call_user_func($function, ...$params); </span> <span>} </span> <span>} </span> <span>} </span><span>} </span>
Dalam kod di atas, kami menunjukkan menggunakan cangkuk dalam satu titik akhir. Cangkuk ini hanya dicetuskan apabila titik akhir /adduser dipanggil, dan hanya selepas sisipan berjaya. Tetapi ini bukan satu -satunya tempat yang boleh anda gunakan cangkuk ini. Mungkin anda mempunyai beberapa kod penghalaan dalam kelas API anda yang berjalan melalui pemeriksaan jika kunci API sah atau anda juga menerima jenis permintaan tertentu.
anda boleh meletakkan cangkuk di peringkat global dalam API supaya setiap permintaan mencetuskannya. Kemudian, pada masa yang akan datang, seseorang boleh menulis logger, melampirkannya ke cangkuk api_init yang anda buat dan tiba -tiba mula log masuk semua permintaan yang dibuat ke API - sekali lagi, tidak menyentuh kod kelas API utama. Cangkuk yang sama juga mungkin mempunyai panggilan balik tambahan yang akan memeriksa penyalahgunaan API dan melaporkannya kepada jabatan teknologi maklumat anda jika ia mula melihat seseorang membanting API anda dengan permintaan.
Imej di bawah adalah gambarajah bagaimana semua ini kelihatan seni bina.
Amalan Terbaik
tip 1: Pastikan cangkuk anda bersandar dan bermakna
Petua 2: Buat setiap panggilan balik terpencil dan mudah untuk debug
Ia juga penting untuk menyedari berapa banyak panggilan balik yang anda lampirkan ke cangkuk anda. Sebilangan kecil panggilan balik adalah baik -baik saja, tetapi 100 panggil balik pada satu cangkuk dengan masing -masing mengambil satu saat untuk dilaksanakan benar -benar boleh menjadi seret pada API anda. Kami mahu panggilan API yang cepat, dan setiap panggilan balik boleh dengan mudah menyeret pada masa tindak balas. Sekali lagi, jika anda mendapati panggilan balik perlahan, buang tugas ke proses latar belakang atau sistem giliran yang akan diambil oleh perkhidmatan lain kemudian. Saya sering menggunakan pekerjaan dalam sistem seperti Laravel untuk mengendalikan tugas -tugas tersebut. Mungkin menambah tugas pengguna ke barisan pekerjaan Laravel dan teruskan dengan pemprosesan API.
Akhir sekali, pastikan anda terus berhubung dengan pemaju anda yang mungkin menggunakan cangkuk ini. Adalah umum bahawa pemaju menggunakan cangkuk anda, dan menulis panggilan balik, bukan orang yang sama yang mencipta cangkuk di API untuk bermula. Apabila API anda matang, anda mungkin mula melihat permintaan untuk menambah lebih banyak cangkuk di tempat yang berbeza dan dengan butiran yang lebih halus. Mereka mungkin meminta sebelum/selepas cangkuk yang boleh digunakan untuk mencetuskan tindakan sebelum pengguna dimasukkan dan selepas itu. Mereka juga boleh meminta maklumat tambahan untuk diserahkan kepada panggilan balik mereka (bukan sahaja nama dan umur mereka tetapi juga ID baru pengguna yang dimasukkan). Ambil permintaan ini sebagai petanda yang baik bahawa devs anda mencari mekanisme yang berguna dan lihat potensi memperluaskan kesan API anda dalam sistem yang berkaitan. Ia benar -benar terasa baik untuk mempunyai sistem yang begitu mudah untuk "cangkuk" ke dalam dan melaksanakan sekeping kod kecil untuk mempunyai kesan yang besar.
Dengan pendekatan ini, langit adalah had pada apa yang anda boleh lakukan API anda. Ini semua dapat dicapai sambil mengekalkan aliran utama titik akhir anda dan bebas dari bunyi bising ketika berurusan dengan sistem lain.
Dalam artikel ini, kita membincangkan apa cangkuk/tindakan dan bagaimana ia boleh digunakan. Kami memberikan beberapa contoh kod PHP yang boleh anda gunakan dalam API PHP anda untuk melaksanakan "Hooking" dan bagaimana panggilan balik boleh digunakan untuk mengikat cangkuk itu. Kami juga membincangkan menambah cangkuk pada tahap API umum (lebih global untuk semua permintaan) serta di titik akhir. Di samping itu, kami juga bercakap sedikit tentang beberapa kelemahan sistem ini dan bahawa ia adalah idea yang baik untuk memastikan panggilan balik anda bersandar dan bermakna. Tetapi sekiranya anda mempunyai panggilan balik yang lama, kami menyebut beberapa strategi untuk menangani proses sedemikian untuk menghalang mereka daripada memberi kesan kepada saluran paip API anda.
Jika anda melaksanakan sistem ini, anda juga boleh mendapatkan beberapa fungsi terbesar yang komuniti WordPress (dan pengaturcara secara umum) telah menikmati selama bertahun -tahun. Anda juga akan menjimatkan banyak masa dan sakit kepala daripada mengubah kod API anda secara langsung, dan anda akan dapat memberi tumpuan kepada kod panggil balik kecil. Anda juga boleh menambah dan mengeluarkan panggilan balik yang mungkin keseluruhan integrasi dengan sistem lain. Semua fungsi ini - dan tidak sekali -kali perlu menerbitkan semula kod saluran paip API anda! Itulah tawaran yang bagus, bukan? Dengan sistem ini, saya telah berjaya melakukan beberapa integrasi mudah dalam sehari, dan sekarang anda juga boleh melakukannya.
Terima kasih kerana membaca!
Bagaimana saya dapat memastikan keselamatan API saya? langkah -langkah. Ini termasuk menggunakan protokol komunikasi yang selamat seperti HTTPS, melaksanakan mekanisme pengesahan dan kebenaran, dan mengesahkan dan membersihkan data input untuk mencegah serangan suntikan. Audit dan kemas kini keselamatan tetap juga boleh membantu mengenal pasti dan memperbaiki kelemahan yang berpotensi.
Bagaimana saya dapat meningkatkan prestasi API saya? caching, dan menggunakan struktur data dan algoritma yang cekap. Ujian dan pemantauan prestasi biasa dapat membantu mengenal pasti kesesakan dan kawasan untuk penambahbaikan. Mengemas kini reka bentuk API berdasarkan maklum balas daripada pemaju dan perubahan dalam keperluan perniagaan. Ia juga penting untuk menyampaikan apa -apa perubahan kepada pengguna API tepat pada masanya, dan untuk memberi sokongan untuk versi lama API di mana perlu.
Atas ialah kandungan terperinci Reka bentuk API yang fleksibel: Buat cangkuk untuk saluran paip API PHP anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!