ホームページ > バックエンド開発 > PHPチュートリアル > Pure PHP で API を作成するにはどうすればよいですか?

Pure PHP で API を作成するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-04 06:11:01
オリジナル
927 人が閲覧しました

Como criar API com PHP Puro?

このプロジェクトでは、任意のフレームワークで PHP のみを使用してシンプルな API を作成します。必要なのは次のものだけです:

  • PHP - 必須
  • 作曲家 - 必須
  • VScode や PHPStorm などのエディタ/IDE
  • Docker - 推奨されますが必須ではありません
  • 郵便配達員 - 推奨されますが、必須ではありません

データベース構成用の docker-compose.yml ファイルを定義することから始めましょう。 Docker を使用してコンテナー内にデータベースを作成したくない場合の解決策は、コンピューターにデータベースをインストールすることです。このチュートリアルでは、MySQL を使用します。

設定

アプリケーションを配置するフォルダーを作成したら、まず docker-compose.yaml を構成します。

services:
  mysql:
    image: mysql:9.1.0
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

説明のためにこのファイルをいくつかの部分に分割してみましょう:

services:
  mysql:
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このファイルでは、使用されるサービスを定義しています。
このサービスに mysql という名前を付けます。 注意、このサービスの名前はホストとしてデータベースに接続するために使用されます

image: mysql:9.1.0
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、データベースの作成に使用するイメージを定義します。このプロジェクトでは、mysql のバージョン 9.1.0 を使用します。
このバージョンと他のバージョンは Docker Hub で見つけることができます。

ports:
      - '3306:3306'
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ポートは 3306 に設定されています。これはデフォルトの mysql ポートです。

ポートが 3306:3306 のようなものであることがわかります。この : は、Docker コンテナーだけでなく、ローカル マシン上でこのポートをリッスンすることを意味します。そのため、マシン上で直接アクセスできます。

environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

環境として、mysql サービスの資格情報を定義する必要があります。
したがって、環境変数を使用してユーザー、パスワード、データベース名を定義しています:

MYSQL_USER: api_user // <--- Este é nosso usuário
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
MYSQL_PASSWORD: api_password // <--- Este é nosso password
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
MYSQL_DATABASE: api_example // <--- Este é nosso banco de dados
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
MYSQL_ROOT_PASSWORD: useroot // <--- Está é a senha para o usuário root
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コンテナを起動するには、docker-compose.yaml ファイルが配置されているフォルダー内でターミナルに次のコマンドを入力するだけです。

docker compose up -d
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これにより、コンテナ内の mysql サービスが初期化されます。
ターミナル内で mysql にアクセスしたい場合は、次のコマンドを使用できます:

docker exec -it <nome do container> bash
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このコマンドを入力して Enter キーを押すと、mysql イメージが実行されているコンテナーに入ります。

コンテナ名は、フォルダー名-ホスト名-番号で形成されます
この場合、アプリケーションが「create-api-php」ディレクトリ内に作成された場合、コンテナの名前は create-api-php-mysql-1 になります。

composer.json ファイルも作成します。このファイルは、プロジェクトで使用される外部ライブラリをインストールするための基礎として機能します。このプロジェクトでは、Dotenv のみを使用します。

services:
  mysql:
    image: mysql:9.1.0
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この行では、php で dotenv に最もよく使用されるライブラリを追加しています。
このライブラリのリポジトリは、Github Vlucas Repository
で見つけることができます。

services:
  mysql:
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

以下の行では、基本的に PSR-4 のデフォルト設定で自動ロードを使用することを示しています。現在最も使用されている PSR は PSR-12 と PSR-4 で、これまでで最も使用されているのは 12 です。ただし、今のところは PSR-4 を使い続けます。

image: mysql:9.1.0
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これら 2 つのファイルが作成されたので、次のコマンドを実行できます

ports:
      - '3306:3306'
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Dotenv ライブラリがインストールされ、目的の PSR の設定が構成されます。
このコマンドの後、composer.lock.

ファイルが環境に作成されます

JavaScript の世界から来た人は、これらのファイルを package.json および package-lock.json と比較できます。

vendor という名前のフォルダーがディレクトリに追加されていることがわかります。このフォルダーには、Dotenv ライブラリと非常に重要なファイル autoload.php が含まれています。
このファイルは他のファイル間で Dotenv 情報をやり取りするため、このファイル内の何も変更したりする必要はありません。

bootstrap.php というファイルも作成します。このファイルは、アプリケーションを初期化し、すべてが期待どおりに動作するようにいくつかの重要なパラメーターを接続する役割を果たします。

environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、.env ファイルを作成して、mysql データベースへの接続を担当する環境変数を追加します。
次に、次を追加します:

MYSQL_USER: api_user // <--- Este é nosso usuário
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

また、誰かがリポジトリのクローンを作成したい場合や、将来プロジェクトを継続したい場合に備えて、この情報のコピーが保存される .env.example ファイルも作成します。何を定義する必要があり、何が不必要かを知るために必要な情報。

MYSQL_PASSWORD: api_password // <--- Este é nosso password
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これら 2 つのファイル (1 つはすべての情報を含み、もう 1 つは情報の一部のみを含む) を作成する理由は、.env ファイルには機密情報が含まれているため、リポジトリにアップロードすべきではないためです。将来、アクセスのために トークン を追加する必要があるサードパーティ API を使用したいとします。その後、この情報を .env ファイル内に保存します。

.env ファイルがリポジトリにアップロードされないようにするには、.gitignore というファイルを作成し、次の情報を追加します。

MYSQL_DATABASE: api_example // <--- Este é nosso banco de dados
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このようにして、.env ファイルとベンダー フォルダーの内容全体がコミットされないことを定義します。

これでプロジェクトの構成が完了したので、自由にコーディングを続けることができます。

成文化

次のディレクトリ src/System を作成し、System 内に DatabaseConnector.php ファイルを作成します

services:
  mysql:
    image: mysql:9.1.0
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、このファイルの ネームスペース を定義しています。これにより、将来このファイルを他のファイル内で使用できるようになります。

services:
  mysql:
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ファイルと同じ名前でクラスを作成し、値 null を渡す $dbConnection という名前のプライベート変数を作成します。
この変数は、このクラスの新しいインスタンスを担当し、データベースに接続します。
詳細については、try-catch を実装するときに後で説明します。

image: mysql:9.1.0
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コンストラクター内で次の変数を作成し、.env ファイルから取得した値を Dotenv で確認します。

ports:
      - '3306:3306'
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コンストラクター内で、実行したいアクションを検証するために try-catch を実行します。

environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この試行では、クラスの新しいインスタンスを作成し、それを $dbConnection 変数に渡そうとしています。これにはパラメータ

を受け取る PDO モジュールを使用しています。
  • DSN - データ ソース名または URI
  • - mysql: 使用しているサービス/銀行です.
  • - ホスト=$host; 私たちのホスト
  • - ポート=$ポート; 私たちのドア
  • - charset=utf8mb4; データベースの utf8 文字セットの定義
  • - dbname=$db データベースの名前
  • USER - データベースにログインするユーザー
  • PASS - データベースにログインするためのパスワード

エラーケース:

MYSQL_USER: api_user // <--- Este é nosso usuário
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

PDO から例外をトリガーし、エラー メッセージを返します。
明らかに、これは開発環境でエラーをどのように表示すべきかを示す単なる一例です。運用環境では、問題をより明確に理解するのに役立つ、より簡潔なエラーを提示することをお勧めします。

コンストラクターの外でクラス内に、次の関数を作成します:

MYSQL_PASSWORD: api_password // <--- Este é nosso password
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

接続のインスタンスを含む変数を呼び出す責任があります。

bootstrap.php ファイルを覚えていますか?次のコード行を追加しましょう:

MYSQL_DATABASE: api_example // <--- Este é nosso banco de dados
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次のようになります:

MYSQL_ROOT_PASSWORD: useroot // <--- Está é a senha para o usuário root
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

フォルダーsrc内にDatabaseという名前の別のディレクトリを作成し、その中にファイルdatabase_seed.php.
を作成します。 このファイルはデータベースに初めてデータを取り込む役割を果たします。そのため、このプロジェクトを誰かと共有したい場合でも、空のデータベースが残ることはありません。

このファイル内に次のコードを追加します:

services:
  mysql:
    image: mysql:9.1.0
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

require 'bootstrap.php' をインポートします。なぜなら、ブートストラップ ファイル内で、データベースのインスタンス化を担当する変数がすでにインポートされているからです。

services:
  mysql:
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Heredoc
の値を持つ $statement という名前の変数を作成します。

image: mysql:9.1.0
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この ヒアドキュメント 内に、いくつかの クエリ を追加します。

ports:
      - '3306:3306'
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、drop table を選択して、ベース全体を削除してから新しいテーブルを開始します。ただし、必要に応じて、このコード行を削除できます。

次のコード行は、このテーブルがトランザクションの実行に使用され、テーブル間に接続があることを指定します。この mysql 宣言について詳しく知りたい場合は、innoDb ドキュメント
を参照してください。

environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

同じ ヒアドキュメント 内に、別の クエリ を追加します:

MYSQL_USER: api_user // <--- Este é nosso usuário
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、person テーブルにデータを挿入しています。

ファイルの最後に try-catch を作成し、そこで クエリ を初期化しようとします。エラーの場合は、上記のコードのデータ処理で行ったのと同じようにエラー メッセージを返します。 .

MYSQL_PASSWORD: api_password // <--- Este é nosso password
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

src 内に TableGateways という名前の別のディレクトリを作成し、その中に PersonGateway.php.
というファイルを作成します。

MYSQL_DATABASE: api_example // <--- Este é nosso banco de dados
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このフォルダー内のファイルは、リポジトリとほぼ同じように、データベースと対話する役割を果たします。

PersonGateway クラスに次のコンストラクターを追加します。

MYSQL_ROOT_PASSWORD: useroot // <--- Está é a senha para o usuário root
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

クラスが他のファイルで呼び出され、クラスのいくつかのメソッドをトリガーできるようになるため、このコンストラクターを追加します。

次の方法を参照してください:

テーブル内のすべてのユーザーをリストするメソッド

docker compose up -d
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

テーブルから単一のユーザーをリストするメソッド

docker exec -it <nome do container> bash
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

テーブルにユーザーを挿入する責任のあるメソッド

{
  "require": {
      "vlucas/phpdotenv": "^2.4"
  },
  "autoload": {
      "psr-4": {
          "Src\": "src/"
      }
  }
}
ログイン後にコピー
ログイン後にコピー

テーブル内のユーザー情報を更新するメソッド

"require": {
      "vlucas/phpdotenv": "^2.4"
},
ログイン後にコピー
ログイン後にコピー

テーブルからユーザーを削除するメソッド

"autoload": {
      "psr-4": {
          "Src\": "src/"
      }
  }
ログイン後にコピー
ログイン後にコピー

src 内に、Controller という名前のディレクトリを作成し、その中に PersonController.php.
というファイルを作成します。 このディレクトリ内のファイルは、アプリケーション ルートと対話する役割を果たします。ここでは銀行と直接対話しますが、サービス層を使用して、すべてのロジックとビジネス ルールをこの層に制限することもできます。
サービス層を作成したい場合は、次のようになります:

services:
  mysql:
    image: mysql:9.1.0
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ただし、このタイプのアーキテクチャをさらに深く掘り下げることは目的ではありません。今のところはコントローラー ファイルの説明を続けます。

services:
  mysql:
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

PersonController クラス内に次の内容を追加します。

image: mysql:9.1.0
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このようにして、データベースの新しいインスタンスと対話していることが保証されます。

リクエストを処理するメソッドも作成しました:

ports:
      - '3306:3306'
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この ヘッダー はステータス コードの送信を担当し、本文が作成された場合は、表示される同じ本文を返します。

environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ルートと対話するメソッドも作成しました。

ユーザーのリストルートとの対話を担当するメソッド

MYSQL_USER: api_user // <--- Este é nosso usuário
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ユーザーの作成ルートとの対話を担当するメソッド

MYSQL_PASSWORD: api_password // <--- Este é nosso password
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ユーザーの更新ルートとの対話を担当するメソッド

MYSQL_DATABASE: api_example // <--- Este é nosso banco de dados
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ユーザーの削除ルートとの対話を担当するメソッド

MYSQL_ROOT_PASSWORD: useroot // <--- Está é a senha para o usuário root
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

検証を担当するメソッド

docker compose up -d
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
docker exec -it <nome do container> bash
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
{
  "require": {
      "vlucas/phpdotenv": "^2.4"
  },
  "autoload": {
      "psr-4": {
          "Src\": "src/"
      }
  }
}
ログイン後にコピー
ログイン後にコピー

最後に、フォルダー src の外に Public という名前のディレクトリを作成します。
このフォルダーには、php 表示ファイルが含まれます。
その中にファイルindex.php
を作成します。 次のコードを追加します:

"require": {
      "vlucas/phpdotenv": "^2.4"
},
ログイン後にコピー
ログイン後にコピー

このファイルは、ヘッダーの設定と URL へのアクセスのチェックを行います。アクセスが成功すると内容が返され、そうでない場合はエラーが返されます。

アプリケーションにアクセスするには、内部 PHP サーバーを使用してサーバーをアップロードするだけです。

"autoload": {
      "psr-4": {
          "Src\": "src/"
      }
  }
ログイン後にコピー
ログイン後にコピー

コンテナを初期化していない場合は、ターミナルに次のコマンドを入力します。

composer install
ログイン後にコピー

ここで、postman または URL の操作に役立つその他のアプリケーションを使用してください。

私のソーシャルネットワーク:
Github Linkedin

以上がPure PHP で API を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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