アプリケーションプログラミングインターフェイス(API)の設計は、挑戦的な努力になる可能性があります。優れたAPIには、簡単で使いやすいシンプルなインターフェイスがあります。この単純なインターフェイスは、多くの複雑なシステムの相互作用になる可能性があり、これらの相互作用は、そうでなければ明確に定義されたエンドポイントタスクの水を本当に濁らせます。時間が経つにつれて、開発者は、既存のエンドポイントの追加のビジネスロジックを「タック」するように求められる場合があります。その後、それを知る前に、単一のAPI呼び出しが、メインフローの一部として12を超えるシステムとのやり取りを行っています。
簡単には、メインフローを曖昧にすることなく後でタスクを追加する機能を備えたパイプラインを開発できればいいのではないでしょうか?この記事では、WordPressからアイデアを適応させ、一般的にプログラミングして、APIがより強力な相互作用を行う能力を提供する方法を示します。
キーテイクアウトフックの背後にあるアイデアは新しいものではなく、WordPressによって発明されませんでした。ただし、WordPressは、サーバー側のページ処理ライフサイクル中にそれらを実装するという素晴らしい仕事をしました。私の意見では、このフックの使用は、おそらくプラットフォームが持っている唯一の最大の機能です。これらのフックを使用すると、ユーザーはWordPressに結び付けられ、必要なときに必要なときに必要なコードを実行する独自の機能を作成できます。ユーザーに送信されたヘッダーを変更する必要がありますか?問題ありません:wp_headersイベントに接続すると、フィットが見えるようにヘッダーを変更できます。
エンドポイントがユーザーを作成するための場合、データベースでそのユーザーレコードを作成することに集中できます。その途中で、そのプロセス中に聞いている人に電話をかけるだけです。たぶん、ユーザーレコードを作成した後、「これを聞いている人は誰でも、ユーザーを作成しただけで、ここに情報があります」と言うイベントを送信します。たぶん、いくつかのコールバック関数がイベントを購読していて、聞いているか、そうでないかもしれません。イベントは本当に気にしません。
このシステムを使用すると、後で書かれている可能性のあるコードにAPIを呼び出すことができます。 APIエンドポイントコード自体に触れる必要なく、これを行うことができます。これがどのように機能するかを示すために、ギアを変更し、これをPHP APIで開始する方法の基本的なメカニズムを示しましょう。ここではPHPを使用している間、他の言語を使用して実際にWebアプリケーションで同様のロジックを実装できることに注意してください。
基本的なメカニズムの構築開始するには、フック/アクションを追加できる必要があります(これはこれから「フック」と呼びます)。また、フックを取り外して最後にフックをトリガーする機能も必要です。これらのメカニズムを定義したら、それらがAPIに含まれていることを確認し、これらのフックを呼び出すことができるAPIの場所を見つける必要があります。以下は、これをセットアップしたい1つの方法です。
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>
<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>
上記のコードは、新しいユーザーを追加する方法についての過度に単純で一般化されたビューです。アイデアは、誰かが私たちのAPI /Adduserのエンドポイントを呼び出す場合、最終的にユーザーの名前と年齢が投稿されたデータから引き出されるこの関数に到達するということです。まず、適切なRESTルールが指示するように投稿していることを確認してから、ユーザーをユーザーテーブルに挿入しようとします。
次に、ユーザーが正常に挿入された場合、ユーザーが作成されたコードを聞くことができるようにフックを呼び出したい(これは他の言語でイベントを提起することに似ています)。
要件が変更された場合に対処する数か月後、マーケティング部門に、新しいユーザーが作成されたら、ユーザーの詳細をメールで送信する必要があると主張しています。ヘルパー関数をAPIに書き込み、このエンドポイントコードから呼び出す傾向があるかもしれません。素晴らしい…それが要求されたすべてなら。しかし、サポートチームが後であなたのところに来て、ユーザーをZendeskシステムに追加してほしいとしたらどうでしょう。したがって、別の関数を記述し、このエンドポイントを呼び出すタックも書きます。
次に、このエンドポイントは、ユーザーをWebサイトデータベースに追加するだけでなく、電子メールを送信する機能を呼び出し、Zendesk、Jira、Microsoft Cloudにユーザーを追加し、成功/失敗の結果を処理することです。この追加のものはすべて、ユーザーをデータベースに追加する明確なポイントから実際に奪うことです。 1つのイベントに電話して、ユーザーが作成されたときに他のコードを聞いて、自分のことをしてもらいたいと思います。このエンドポイントをまったく変更する必要はありません。おそらく、他のサービスは新しいユーザーの追加に関心がないので、誰も何もするように求められていません。エンドポイントは気にする必要はありません。かなり素晴らしいですよね?
フックに名前を付けて、例を続けましょう。これは、すべてのコールバックコードが聞くために使用する必要がある名前です。繰り返しますが、他の言語ではこのセットアップを「イベント」と呼んでいるので、指定された言語で調べて、詳細を確認してください。
フックadded_userに電話します。シンプルで、まっすぐにまっすぐだと思いませんか?名前ができたら、このフックをどこに呼びたいかを決定できます。挿入が成功した直後に良いアイデアになると思います:
<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>
ここで、added_userフックを聞くか、何十ものコールバック関数を使用できるか、まったくありません。ユーザーをZendeskに挿入する責任があるコールバックと、名前と年齢を取り、マーケティングにメールを生成する別のコールバックがあるかもしれません。この「サブスクライバー」コードは、APIプロジェクト内にhooks.phpコードを見ることができる限り、コードベースのどこかに住むことができます。通常、コールバック関数を別のファイルに配置し、そのファイルも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>
API内のグローバルレベルにフックを入れて、すべての要求がトリガーされるようにすることができます。その後、後で誰かがロガーを書いて、作成したAPI_INITフックに添付し、突然APIに作成されたすべてのリクエストのログを開始することができます。同じフックには、APIの悪用をチェックし、誰かがリクエストでAPIを叩いているのを見始めた場合、情報技術部門に報告する追加のコールバックが添付されている場合があります。
以下の画像は、これがすべてアーキテクチャにどのように見えるかの図です。
このメカニズムを複数の場所で使用できるため、最初、中央、およびAPIエンドポイントの最後にフックを呼び出すこともできます。また、リクエストを処理するAPIライフサイクル全体のさまざまなポイントにフックを使用することもできます。これらのdo_hook呼び出しを挿入する場所に関するデザイン次第です。
ベストプラクティス
ヒント1:フックを無駄のない状態に保ち、平均
ヒント2:各コールバックを分離して簡単にデバッグします
ヒント4:開発者コミュニティと連絡を取り合ってください
結論
この記事では、フック/アクションとは何か、どのように使用されるかについて説明しました。 PHP APIで使用できるPHPコードの例を挙げて、「フック」を実装し、コールバックを使用してそのフックに結び付ける方法を示しました。また、一般的なAPIレベル(すべてのリクエストに対してグローバルに)およびエンドポイントにフックを追加することについても説明しました。それに加えて、このシステムの欠点のいくつかについても少し話しました。コールバックを無駄のないものに保つことをお勧めします。しかし、長期にわたるコールバックがある場合、APIパイプラインに影響を与えないように、そのようなプロセスに対処するためのいくつかの戦略について言及しました。このシステムを実装すると、WordPressコミュニティ(およびプログラマー全般)が長年享受してきた最大の機能を獲得することもできます。また、APIコードを直接変更する必要があることから、多くの時間と頭痛を節約することで、代わりに小さなコールバックコードに集中することができます。また、他のシステムとの統合全体である可能性のあるコールバックを追加および削除することもできます。このすべての機能 - APIパイプラインコードを再発行する必要はありません。それはかなり良いことですよね?このシステムを使用すると、1日で簡単な統合を行うことができました。
読んでくれてありがとう!
柔軟なAPIデザインとPHPフックに関するよくある質問(FAQ)
APIが正しく機能していることを確認するにはどうすればよいですか?応答の確認。これは、Postmanなどのツールを使用して手動で実行するか、テストフレームワークを自動的に使用することができます。機能、パフォーマンス、セキュリティなど、APIのすべての側面をテストすることが重要です。エラーメッセージ。これにより、開発者は何がうまくいかず、どのように修正するかを理解するのに役立ちます。また、デバッグと分析のためにエラーをログに記録することも重要です。
APIのパフォーマンスを改善するには、データベースクエリの最適化、実装など、いくつかの戦略が含まれる場合があります。キャッシュ、および効率的なデータ構造とアルゴリズムの使用。定期的なパフォーマンスのテストと監視は、改善のためにボトルネックと領域を特定するのに役立ちます。
以上が柔軟なAPIデザイン:PHP APIパイプライン用のフックを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。