設(shè)計應(yīng)用程序編程接口(API)可能是一項具有挑戰(zhàn)性的努力。良好的API具有簡單易用的簡單接口。在這個簡單的接口背后可以是許多復(fù)雜的系統(tǒng)交互,這些交互實際上可能會使原本明確定義的端點任務(wù)的水域變得混亂。隨著時間的流逝,可能會要求開發(fā)人員為現(xiàn)有終點“了解”其他業(yè)務(wù)邏輯。然后,在您不知不覺中,作為主要流程的一部分,一個API調(diào)用正在與十幾個系統(tǒng)進(jìn)行交互。
>如果我們可以開發(fā)一個簡單的管道,但是可以在以后添加其他任務(wù)而不掩蓋主流量的情況下添加其他任務(wù),那不是很好嗎?本文將向您展示如何從WordPress和編程中調(diào)整一個想法,以使您的API能夠進(jìn)行更強(qiáng)大的互動。
>鑰匙要點
- >利用PHP API中的掛鉤來增強(qiáng)靈活性并通過允許在不更改核心端點代碼的情況下動態(tài)添加其他功能來保持干凈的主流量。
> 通過定義添加,刪除和觸發(fā)這些鉤子的全局函數(shù)來實現(xiàn)掛鉤,這些鉤可在API的不同部分中使用,從而確保對主要應(yīng)用程序邏輯的最小破壞。 >考慮將鉤子放在API生命周期內(nèi)的戰(zhàn)略點上,例如成功的數(shù)據(jù)庫插入或請求驗證期間,根據(jù)API的狀態(tài)或操作有條件地執(zhí)行其他任務(wù)。 - > 通過保持與掛鉤相關(guān)的回調(diào)精益,以避免性能瓶頸,隔離回調(diào)功能以簡化調(diào)試,并注意維持API響應(yīng)的主動回調(diào)數(shù)量。 >保持與開發(fā)人員社區(qū)的互動,以接收反饋和要求新掛鉤的請求,這可能會導(dǎo)致API的功能和靈活性不斷提高,從而輕松地適應(yīng)新的業(yè)務(wù)需求而無需進(jìn)行大量重寫。
- >
- 什么是掛鉤/動作?
- >鉤子(又稱操作/過濾器)是WordPress社區(qū)給事件及其相關(guān)回調(diào)的名稱。如果您在編程方面有任何經(jīng)驗,那么您可能熟悉回調(diào)和發(fā)布者 - subscriber模式。在處理過程中,系統(tǒng)可能會觸發(fā)一個事件,該事件將零歸為零,以訂閱該事件的許多功能。例如,在響應(yīng)加載頁面時,WordPress呼吁加載標(biāo)題,加載標(biāo)題,列出帖子或查找正確模板的功能。這些任務(wù)是在不混亂生成頁面的主要過程的情況下運(yùn)行的。 >
鉤背后的想法并不是什么新鮮事物,也不是WordPress發(fā)明的。但是,WordPress在其服務(wù)器端處理生命周期期間實現(xiàn)了它們,做得很好。在我看來,這種鉤子的使用可能是平臺擁有的最大功能。使用這些掛鉤,用戶可以編寫自己的功能(無論是插件還是主題),可以將其連接到WordPress中,并在需要時運(yùn)行您想要的任何代碼。您需要更改發(fā)送給用戶的標(biāo)頭嗎?沒問題:進(jìn)入WP_headers事件,您可以在發(fā)現(xiàn)合適的情況下更改標(biāo)題。
為什么在API中使用鉤?
>鉤子對許多事情都有好處,包括觸發(fā)某些側(cè)面任務(wù),通過PHP curl命令召集另一個系統(tǒng),構(gòu)建對象并將其放入任務(wù)隊列中,以后再由另一個系統(tǒng)撿起,發(fā)送電子郵件,發(fā)送電子郵件,發(fā)送電子郵件還有更多。這一切都可以完成,而無需蒙蔽給定端點的主要流(并且可能在此過程中強(qiáng)迫新的API版本)。如果端點是用于創(chuàng)建用戶的終點,我們可以專注于在數(shù)據(jù)庫中創(chuàng)建該用戶記錄,并在此過程中召集在此過程中正在偵聽的任何人。也許在創(chuàng)建用戶記錄之后,我們發(fā)出了一個事件,上面寫著“任何人都在聽此操作,我只是創(chuàng)建了一個用戶,這是他們的信息”。也許某些回調(diào)功能已經(jīng)訂閱了該事件,并且正在聽,或者也沒有。該活動并不真正在乎。
>使用此系統(tǒng),我們可以將API呼喚到可能在以后的某個時間編寫的代碼。我們可以做到這一點,而無需觸摸API端點代碼本身。為了證明這可能是如何工作的,讓我們更改齒輪,并展示如何以PHP API開始實現(xiàn)這一目標(biāo)的基本機(jī)制。請記住,當(dāng)我們在此處使用PHP時,我們實際上可以使用其他語言在Web應(yīng)用程序中實現(xiàn)類似的邏輯。
構(gòu)建基本機(jī)制
為了開始,我們需要能夠添加一個鉤子/操作(從現(xiàn)在開始我將其稱為“鉤子”)。我們還需要能夠卸下鉤子并觸發(fā)鉤子的能力。定義這些機(jī)制后,我們只需要確保它們包含在API中,然后在API中找到可能需要調(diào)用這些鉤子的位置即可。以下是我們可能想設(shè)置此的一種方式。這是hooks.php:
>現(xiàn)在我們已經(jīng)創(chuàng)建了hooks.php文件,我們只需要將其包含在我們的API中,以便可以看到這些功能。完成此操作后,這只是使用DO_HOOK將鉤子插入我們的API的問題。
<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>作為一個簡單的例子,假設(shè)我們有一個用于使用系統(tǒng)注冊新用戶的API。我們可能有一個REST API端點,稱為 /adduser。以簡單性的名義,我們還假設(shè)這里的目標(biāo)是將新用戶的名稱和年齡插入我們的數(shù)據(jù)庫用戶表中。很簡單,對嗎?
>
<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>
上面的代碼是我們?nèi)绾翁砑有掠脩舻倪^度簡單和普遍的視圖。這個想法是,如果某人打電話給我們的API /Adduser端點,他們最終將在此功能中得出此功能,從而將用戶的名稱和年齡從已發(fā)布的數(shù)據(jù)中提取出來。我們首先檢查以確保他們發(fā)布(作為適當(dāng)?shù)男菹⒁?guī)則規(guī)定),然后嘗試將用戶插入用戶表中。
接下來,如果成功插入了用戶,我們想調(diào)用鉤子,以使任何創(chuàng)建用戶的代碼偵聽(這類似于用其他語言提出事件)。
當(dāng)需求變化時該怎么辦
幾個月后,我們讓我們的營銷部門堅持認(rèn)為,當(dāng)創(chuàng)建新用戶時,應(yīng)將電子郵件發(fā)送給用戶的詳細(xì)信息。我們可能傾向于將助手功能寫入API,然后從此端點代碼中調(diào)用它。太好了……如果這就是要求的。但是,如果支持團(tuán)隊后來來到您身邊,并希望您還將用戶添加到他們的Zendesk系統(tǒng)中。因此,您還編寫另一個功能,并將其撥打到此端點。
接下來,您知道,此端點不僅是將用戶添加到我們的網(wǎng)站數(shù)據(jù)庫中,而且還呼吁發(fā)送電子郵件,將用戶添加到Zendesk,Jira和Microsoft Cloud,然后處理其成功/失敗結(jié)果。所有這些其他東西確實從將用戶添加到我們的數(shù)據(jù)庫的清晰點中。我們想調(diào)用一個事件,并讓其他代碼在創(chuàng)建用戶并做自己的事情時聆聽 - 而無需我們修改此端點。也許沒有其他服務(wù)在乎添加新用戶,因此沒有人被要求做任何事情。終點不必關(guān)心。很棒,對
>讓我們以鉤子的名字來繼續(xù)我們的榜樣。這是所有回調(diào)代碼都需要使用的名稱。同樣,其他語言將此設(shè)置稱為“事件”,因此請務(wù)必用給定的語言查找它以了解更多信息。
我們將調(diào)用hook add_user。簡單而直截了當(dāng),你不覺得嗎?一旦有名,我們就可以決定要在哪里稱呼此鉤子。我認(rèn)為成功插入后是個好主意:
<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>
>現(xiàn)在,我們可以有數(shù)十個回調(diào)函數(shù)收聽添加_user鉤或根本沒有。也許我們有一個回調(diào),負(fù)責(zé)將用戶插入Zendesk,而另一個將插入姓名和年齡并為營銷生成電子郵件。只要可以在API項目中看到hooks.php代碼,就可以在代碼庫中的其他地方生活。我通常將回調(diào)函數(shù)放在單獨(dú)的文件中,并將該文件也包括在API中。以下是回調(diào)的一個示例,現(xiàn)在可以利用我們創(chuàng)建的這個新鉤子:
最佳實踐 >
>請注意您在鉤子上附加多少個回調(diào)也很重要。少數(shù)幾個快速回調(diào)是可以的,但是單個掛鉤上的100個回調(diào),每秒鐘執(zhí)行一秒鐘確實可以阻止您的API。我們需要快速的API調(diào)用,并且每個回調(diào)都可以輕松拖動響應(yīng)時間。同樣,如果您發(fā)現(xiàn)回調(diào)速度慢,請將任務(wù)扔到背景過程或隊列系統(tǒng)中,以后將由另一個服務(wù)撿起。我經(jīng)常在Laravel之類的系統(tǒng)中使用工作來處理此類任務(wù)。也許將用戶任務(wù)添加到Laravel作業(yè)隊列中,然后繼續(xù)進(jìn)行API處理。 使用這種方法,天空是您可以擁有的API所做的限制。在與其他系統(tǒng)打交道時,這一切都可以實現(xiàn),同時保持端點的主要流量清晰,沒有噪音。 結(jié)論 如果您實現(xiàn)了此系統(tǒng),則您也可以獲得WordPress社區(qū)(以及總體程序員)多年來所享受的一些最大功能。您還可以節(jié)省很多時間和頭痛,從必須直接修改API代碼,并且可以專注于小回調(diào)代碼。您還可以添加和刪除可能與其他系統(tǒng)的整個集成在一起的回調(diào)。所有這些功能 - 不必重新發(fā)布您的API管道代碼!這是一個很好的交易,對吧?有了這個系統(tǒng),我一天都設(shè)法進(jìn)行了一些簡單的集成,現(xiàn)在您也可以做到。 感謝您的閱讀! >如何為我的PHP API管道創(chuàng)建掛鉤?對于您的PHP API管道,涉及定義可以執(zhí)行自定義代碼的代碼中的特定點。這通常是使用事件和聽眾完成的。當(dāng)發(fā)生特定事件時,觸發(fā)相應(yīng)的偵聽器,執(zhí)行自定義代碼。這使您可以在運(yùn)行時修改應(yīng)用程序的行為,提供高度的靈活性和適應(yīng)性。 PHP與API設(shè)計的其他語言相比如何? > >如何處理API中的錯誤? >我如何提高API的性能?<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>
我們可以在哪里放置這些鉤子?
在上面的代碼中,我們在單個端點中使用鉤子演示。僅在調(diào)用 /adduser端點時才觸發(fā)此鉤子,并且只有在插入成功后才觸發(fā)。但這不是您唯一可以使用這些鉤子的地方。也許您在API類中有一些路由代碼,可以通過檢查API密鑰是否有效,或者您甚至收到某種類型的請求。 >由于您可以在多個位置使用此機(jī)制,因此您甚至可以在API端點的開頭,中間和結(jié)尾處使用鉤子。您還可以在處理請求的整個API生命周期的各個點上有鉤子。這實際上取決于您在插入這些do_hook呼叫的位置上的設(shè)計。
>現(xiàn)在讓我們介紹一些最佳實踐,以供您和您的開發(fā)人員遵循。
>提示1:保持鉤子瘦弱和平均
>提示2:使每個回調(diào)隔離且易于調(diào)試
提示3:考慮性能,不要濫用鉤子
提示4:與您的開發(fā)社區(qū)保持聯(lián)系
最后,確保您與可能使用這些掛鉤的開發(fā)人員保持聯(lián)系。通常,開發(fā)人員使用您的鉤子和編寫回調(diào),與創(chuàng)建API中創(chuàng)建鉤子的人并不是一開始。隨著API的成熟,您可能會開始看到在不同地方添加更多鉤子和更精細(xì)的粒度的請求。他們可能會要求在插入用戶之前和之后插入用戶之前/之后的掛鉤之前/之后。他們還可能要求將其他信息傳遞給他們的回調(diào)(不僅是他們的名稱和年齡,還包括插入用戶的新ID)。以這些要求為一個好兆頭,表明您的開發(fā)人員發(fā)現(xiàn)該機(jī)制有用,并看到擴(kuò)大API在相關(guān)系統(tǒng)中的影響的潛力。擁有一個非常容易“掛接”并執(zhí)行一小塊代碼以產(chǎn)生巨大影響的系統(tǒng)真的感覺很好。
>
關(guān)于靈活的API設(shè)計和PHP掛鉤的常見問題(常見問題解答)
> PHP API管道中掛鉤在PHP API管道中的重要性是什么?它們允許開發(fā)人員在程序執(zhí)行中的特定點插入自定義代碼,而無需更改核心代碼。這使得在不破壞整個系統(tǒng)的情況下更容易添加,修改或刪除功能。鉤子本質(zhì)上是由特定動作觸發(fā)的事件,可以用來以干凈且有條理的方式擴(kuò)展應(yīng)用程序。
>>設(shè)計靈活的API的最佳實踐是什么?幾種最佳實踐。首先,保持API簡單而直觀非常重要,從而使開發(fā)人員易于理解和使用。其次,應(yīng)將API設(shè)計為可擴(kuò)展的,從而允許添加新功能而不會破壞現(xiàn)有功能。第三,提供清晰,全面的文檔至關(guān)重要,幫助開發(fā)人員了解如何有效使用API??。最后,使用標(biāo)準(zhǔn)的HTTP方法和狀態(tài)代碼可以使API更容易預(yù)測,更易于使用。
> > API設(shè)計中有哪些共同的挑戰(zhàn),如何解決?
API設(shè)計可以提出一些挑戰(zhàn),包括確保一致性,管理版本控制和有效處理錯誤。一致性可以通過遵循既定的慣例和標(biāo)準(zhǔn)來維持。可以通過在API URL或請求標(biāo)頭中包含版本編號來管理版本控制。應(yīng)該優(yōu)雅地處理錯誤,提供清晰且有用的錯誤消息,以幫助開發(fā)人員診斷和解決問題。>
>我如何確保API的安全性?措施。這包括使用安全通信協(xié)議,例如HTTP,實施身份驗證和授權(quán)機(jī)制,以及驗證和消毒輸入數(shù)據(jù)以防止注射攻擊。定期的安全審核和更新還可以幫助識別和修復(fù)潛在的漏洞。>測試您的API涉及向API端點和API的請求驗證響應(yīng)。這可以使用郵遞員等工具手動完成,也可以自動使用測試框架來完成。測試API的各個方面,包括功能,性能和安全性很重要。
>處理API中的處理錯誤涉及返回適當(dāng)?shù)腍TTP狀態(tài)代碼和錯誤消息。這有助于開發(fā)人員了解出了什么問題以及如何解決問題。記錄錯誤和分析的錯誤也很重要。
以上是靈活的API設(shè)計:為您的PHP API管道創(chuàng)建鉤子的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯誤并提升代碼穩(wěn)定性。

要安全處理PHP文件上傳需驗證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗證上傳來源通過token防止CSRF并通過finfo_file檢測真實MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測類型決定擴(kuò)展名存儲至非Web目錄;3.PHP配置限制上傳大小及臨時目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時需注意閉合符號和避免嵌套。

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

在PHP中獲取字符串特定索引字符可用方括號或花括號,但推薦方括號;索引從0開始,超出范圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動態(tài)字符串需驗證有效性,多語言項目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

易于效率,啟動啟動tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
