ホームページ > バックエンド開発 > PHPチュートリアル > 柔軟なAPIデザイン:PHP APIパイプライン用のフックを作成します

柔軟なAPIデザイン:PHP APIパイプライン用のフックを作成します

Joseph Gordon-Levitt
リリース: 2025-02-08 10:57:09
オリジナル
340 人が閲覧しました

柔軟なAPIデザイン:PHP APIパイプライン用のフックを作成します

アプリケーションプログラミングインターフェイス(API)の設計は、挑戦的な努力になる可能性があります。優れたAPIには、簡単で使いやすいシンプルなインターフェイスがあります。この単純なインターフェイスは、多くの複雑なシステムの相互作用になる可能性があり、これらの相互作用は、そうでなければ明確に定義されたエンドポイントタスクの水を本当に濁らせます。時間が経つにつれて、開発者は、既存のエンドポイントの追加のビジネスロジックを「タック」するように求められる場合があります。その後、それを知る前に、単一のAPI呼び出しが、メインフローの一部として12を超えるシステムとのやり取りを行っています。

簡単には、メインフローを曖昧にすることなく後でタスクを追加する機能を備えたパイプラインを開発できればいいのではないでしょうか?この記事では、WordPressからアイデアを適応させ、一般的にプログラミングして、APIがより強力な相互作用を行う能力を提供する方法を示します。

キーテイクアウト

    PHP APIでフックを利用して、コアエンドポイントコードを変更せずに追加の機能を動的に追加できるようにすることにより、柔軟性を高め、クリーンなメインフローを維持します。 グローバル関数を定義してこれらのフックを追加、削除、トリガーすることによりフックを実装します。これらのフックは、APIのさまざまな部分で使用できるため、メインアプリケーションロジックへの最小限の混乱を確保します。
  • データベースの挿入が成功した後やリクエスト検証中など、APIライフサイクル内の戦略的なポイントにフックを配置することを検討して、APIの状態またはアクションに基づいて追加のタスクを実行します。 フック関連のコールバックを無駄のない状態に保ち、パフォーマンスボトルネックを避け、コールバック関数を分離してデバッグを簡素化し、API応答性を維持するためのアクティブなコールバックの数に注意することにより、ベストプラクティスを遵守します。
  • 開発者コミュニティと関わりを積んで​​、新しいフックのフィードバックとリクエストを受け取ります。これにより、APIの機能と柔軟性が継続的に改善され、広範な書き直しなしで新しいビジネス要件に簡単に適応できます。
  • フック/アクションとは?
  • フック(別名アクション/フィルター)は、WordPressコミュニティによってイベントとそれらに関連するコールバックに与えられた名前です。プログラミングの経験がある場合は、コールバックとパブリッシャーとサブスクリバーパターンに精通している可能性があります。処理中、システムは、そのイベントに登録されている多くの関数を呼び出すイベントをトリガーする場合があります。たとえば、ページの読み込みに応じて、WordPressは、ヘッダーをロードしたり、タイトルを読み込んだり、投稿をリストしたり、適切なテンプレートを探したりする機能を呼び出します。これらのタスクは、ページを生成する主なプロセスを乱雑にすることなく実行されます。

    フックの背後にあるアイデアは新しいものではなく、WordPressによって発明されませんでした。ただし、WordPressは、サーバー側のページ処理ライフサイクル中にそれらを実装するという素晴らしい仕事をしました。私の意見では、このフックの使用は、おそらくプラットフォームが持っている唯一の最大の機能です。これらのフックを使用すると、ユーザーはWordPressに結び付けられ、必要なときに必要なときに必要なコードを実行する独自の機能を作成できます。ユーザーに送信されたヘッダーを変更する必要がありますか?問題ありません:wp_headersイベントに接続すると、フィットが見えるようにヘッダーを変更できます。

    なぜAPIでフックを使用するのか

    フックは、いくつかのサイドタスクのトリガー、PHPカールコマンドを介して別のシステムに呼びかけ、オブジェクトを構築し、タスクキューに入れて別のシステムでピックアップされ、電子メールの送信など、多くのことに適しています。もっと。これはすべて、特定のエンドポイントのメインフローを曇らせる必要なく(そしておそらくプロセスで新しいAPIバージョンを強制することができます)。

    エンドポイントがユーザーを作成するための場合、データベースでそのユーザーレコードを作成することに集中できます。その途中で、そのプロセス中に聞いている人に電話をかけるだけです。たぶん、ユーザーレコードを作成した後、「これを聞いている人は誰でも、ユーザーを作成しただけで、ここに情報があります」と言うイベントを送信します。たぶん、いくつかのコールバック関数がイベントを購読していて、聞いているか、そうでないかもしれません。イベントは本当に気にしません。

    このシステムを使用すると、後で書かれている可能性のあるコードにAPIを呼び出すことができます。 APIエンドポイントコード自体に触れる必要なく、これを行うことができます。これがどのように機能するかを示すために、ギアを変更し、これをPHP APIで開始する方法の基本的なメカニズムを示しましょう。ここではPHPを使用している間、他の言語を使用して実際にWebアプリケーションで同様のロジックを実装できることに注意してください。

    基本的なメカニズムの構築

    開始するには、フック/アクションを追加できる必要があります(これはこれから「フック」と呼びます)。また、フックを取り外して最後にフックをトリガーする機能も必要です。これらのメカニズムを定義したら、それらがAPIに含まれていることを確認し、これらのフックを呼び出すことができるAPIの場所を見つける必要があります。以下は、これをセットアップしたい1つの方法です。

    ここにhooks.php:

    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>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
簡単な例として、システムに新しいユーザーを登録するためのAPIがあると仮定しましょう。 /adduserと呼ばれるREST 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 /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>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これらのフックをどこに配置できますか?

上記のコードでは、単一のエンドポイントでフックを使用することを示します。このフックは、 /adduserエンドポイントが呼び出された場合にのみトリガーされ、挿入が成功した後にのみです。しかし、これらのフックを使用できる場所はこれだけではありません。 APIクラスには、APIキーが有効であるかどうか、または特定のタイプのリクエストを受け取ったかどうかを確認することで実行されるルーティングコードがある可能性があります。

API内のグローバルレベルにフックを入れて、すべての要求がトリガーされるようにすることができます。その後、後で誰かがロガーを書いて、作成したAPI_INITフックに添付し、突然APIに作成されたすべてのリクエストのログを開始することができます。同じフックには、APIの悪用をチェックし、誰かがリクエストでAPIを叩いているのを見始めた場合、情報技術部門に報告する追加のコールバックが添付されている場合があります。

以下の画像は、これがすべてアーキテクチャにどのように見えるかの図です。

柔軟なAPIデザイン:PHP APIパイプライン用のフックを作成します

このメカニズムを複数の場所で使用できるため、最初、中央、およびAPIエンドポイントの最後にフックを呼び出すこともできます。また、リクエストを処理するAPIライフサイクル全体のさまざまなポイントにフックを使用することもできます。これらのdo_hook呼び出しを挿入する場所に関するデザイン次第です。

ベストプラクティス

あなたとあなたの開発者が従うためのいくつかのベストプラクティスをカバーしましょう。

ヒント1:フックを無駄のない状態に保ち、平均

留意すべきことの1つは、これらのフックが単一のスレッドで実行されるコードに依然としてコールアウトしていることです。コールバックで何かをトリガーしない限り、タスクをバックグラウンドプロセスまたは他のサービスにキックする場合でも、APIはこの余分なコードを実行します(フックがトリガーされたとき)。これは、コールバックコードを無駄のない状態に保つために最善を尽くす必要があることを意味します。長期にわたるコールバックコードは、エンドポイントまたはAPI全体を遅くすることになります。

ヒント2:各コールバックを分離して簡単にデバッグします

ただし、この構造の設計方法により、フックのコールバック関数を追加および削除することは簡単で、デバッグも同様に簡単です。どのコールバックが犯罪者であるかを見つけ(各コールバックログデータをいくつか持っているかもしれません)、それがどこに行き詰まっているのかを見つけてください。その後、バグが固定されるか、コールバックコードを介して動作するまでフックを購読しないでください。これもエンドポイント/APIコード内で何も触れず、APIコードが本番環境で実行されないようにしません。

ヒント3:パフォーマンスについて考えて、フックを乱用しないでください

また、フックに接続するコールバックの数に注意することも重要です。クイックコールバックのほんの一握りは問題ありませんが、1秒かかる1秒かかり、実行するのに1秒かかり、実際にAPIをドラッグすることができます。高速API呼び出しが必要であり、各コールバックは応答時間を簡単にドラッグできます。繰り返しになりますが、コールバックが遅いことがわかった場合は、タスクをバックグラウンドプロセスまたはキューシステムに捨てて、後で別のサービスでピックアップします。 Laravelのようなシステムでジョブを使用して、そのようなタスクを処理します。ユーザータスクをLaravelジョブキューに追加して、API処理を続行します。

ヒント4:開発者コミュニティと連絡を取り合ってください

最後に、これらのフックを使用している可能性のある開発者と連絡を取り合うことを確認してください。開発者がフックを使用し、コールバックを書くことは、最初からAPIでフックを作成した人とは異なることがよくあります。 APIが成熟するにつれて、さまざまな場所やより細かい粒度を使用して、より多くのフックを追加するリクエストが表示される可能性があります。彼らは、ユーザーが挿入される前にアクションをトリガーするために使用できるフック前/後のフックを要求するかもしれません。また、コールバックに追加情報を渡すように要求する場合があります(名前と年齢だけでなく、挿入されたユーザーの新しいIDなど)。これらの要求を、開発者がメカニズムが有用であることを見つけ、関連システムでAPIの影響を拡大する可能性を確認することを示す良い兆候としてください。大きな影響を与えるために小さなコードを「フック」して実行するのが非常に簡単なシステムがあるのは本当に気持ちがいいです。 このアプローチを使用すると、空はAPIにできることの限界です。これはすべて、エンドポイントのメインフローをクリアに保ち、他のシステムを扱うときにノイズを解放しないようにすることができます。

結論

この記事では、フック/アクションとは何か、どのように使用されるかについて説明しました。 PHP APIで使用できるPHPコードの例を挙げて、「フック」を実装し、コールバックを使用してそのフックに結び付ける方法を示しました。また、一般的なAPIレベル(すべてのリクエストに対してグローバルに)およびエンドポイントにフックを追加することについても説明しました。それに加えて、このシステムの欠点のいくつかについても少し話しました。コールバックを無駄のないものに保つことをお勧めします。しかし、長期にわたるコールバックがある場合、APIパイプラインに影響を与えないように、そのようなプロセスに対処するためのいくつかの戦略について言及しました。

このシステムを実装すると、WordPressコミュニティ(およびプログラマー全般)が長年享受してきた最大の機能を獲得することもできます。また、APIコードを直接変更する必要があることから、多くの時間と頭痛を節約することで、代わりに小さなコールバックコードに集中することができます。また、他のシステムとの統合全体である可能性のあるコールバックを追加および削除することもできます。このすべての機能 - APIパイプラインコードを再発行する必要はありません。それはかなり良いことですよね?このシステムを使用すると、1日で簡単な統合を行うことができました。

読んでくれてありがとう!

柔軟なAPIデザインとPHPフックに関するよくある質問(FAQ)

PHP APIパイプラインのフックの重要性は何ですか?

PHP APIパイプラインのフックは、アプリケーションの柔軟性を高める上で重要な役割を果たします。開発者は、コアコードを変更せずに、プログラム実行の特定のポイントでカスタムコードを挿入できます。これにより、システム全体を混乱させることなく、機能を追加、変更、または削除しやすくなります。フックは基本的に特定のアクションによってトリガーされるイベントであり、それらを使用してアプリケーションをクリーンで整理した方法で拡張することができます。 PHP APIパイプラインには、カスタムコードを実行できるコード内の特定のポイントを定義することが含まれます。これは通常、イベントとリスナーを使用して行われます。特定のイベントが発生すると、対応するリスナーがトリガーされ、カスタムコードが実行されます。これにより、実行時にアプリケーションの動作を変更し、高度な柔軟性と適応性を提供できます。いくつかのベストプラクティス。まず、APIをシンプルで直感的に保つことが重要であり、開発者が簡単に理解して使用できるようにすることが重要です。第二に、APIは拡張可能になるように設計されている必要があり、既存の機能を破らずに新機能を追加できるようにします。第三に、明確で包括的なドキュメントを提供し、開発者がAPIを効果的に使用する方法を理解できるようにすることが重要です。最後に、標準のHTTPメソッドとステータスコードを使用すると、APIがより予測可能かつ使いやすくなります。PHPはAPIデザインの他の言語と比較してどうですか?そのシンプルさと柔軟性のために設計。 JSONやXMLを含む幅広いデータ形式をサポートしているため、さまざまなクライアントが消費できるAPIを簡単に作成できます。 PHPには、大規模でアクティブなコミュニティもあり、開発者に豊富なリソースとサポートを提供しています。ただし、他の言語と同様に、その長所と短所があり、言語の選択はプロジェクトの特定の要件に基づいている必要があります。

API設計におけるいくつかの一般的な課題は何ですか?また、どのように対処できるのか?一貫性は、確立された慣習と基準に従うことにより維持できます。バージョン化は、API URLにバージョン番号を含めるか、リクエストヘッダーを含めることができます。エラーは優雅に処理する必要があり、開発者が問題を診断および修正するのに役立つ明確で役立つエラーメッセージを提供します。対策。これには、HTTPSなどの安全な通信プロトコルの使用、認証と承認メカニズムの実装、注入攻撃を防ぐための入力データの検証と消毒が含まれます。定期的なセキュリティ監査と更新は、潜在的な脆弱性を識別および修正するのにも役立ちます。

APIが正しく機能していることを確認するにはどうすればよいですか?応答の確認。これは、Postmanなどのツールを使用して手動で実行するか、テストフレームワークを自動的に使用することができます。機能、パフォーマンス、セキュリティなど、APIのすべての側面をテストすることが重要です。エラーメッセージ。これにより、開発者は何がうまくいかず、どのように修正するかを理解するのに役立ちます。また、デバッグと分析のためにエラーをログに記録することも重要です。

APIのパフォーマンスを向上させるにはどうすればよいですか?

APIのパフォーマンスを改善するには、データベースクエリの最適化、実装など、いくつかの戦略が含まれる場合があります。キャッシュ、および効率的なデータ構造とアルゴリズムの使用。定期的なパフォーマンスのテストと監視は、改善のためにボトルネックと領域を特定するのに役立ちます。

要件の変更によりAPIを最新に保つにはどうすればよいですか?開発者からのフィードバックとビジネス要件の変更に基づいてAPI設計を更新します。また、APIユーザーにタイムリーに変更を伝え、必要に応じてAPIの古いバージョンのサポートを提供することも重要です。

以上が柔軟なAPIデザイン:PHP APIパイプライン用のフックを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート