如何使用純 PHP 建立 API?

Patricia Arquette
發布: 2024-11-04 06:11:01
原創
860 人瀏覽過

Como criar API com PHP Puro?

在這個專案中,我們將在任何框架中僅使用 PHP 建立一個簡單的 API。我們所需要的只是:

  • PHP - 必備
  • 作曲家 - 必備
  • 編輯器/IDE,如 VScode 或 PHPStorm
  • 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
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

接下來我定義將使用哪個圖像來建立我們的資料庫,對於這個項目,我使用 mysql9.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
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

建立這兩個檔案後,我們可以發出指令

ports:
      - '3306:3306'
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

它將安裝 Dotenv 函式庫並配置所需 PSR 的設定。
執行此命令後,將在我們的環境中建立composer.lock.

文件

對於來自 JavaScript 世界的人來說,這些檔案可以與 package.jsonpackage-lock.json.

進行比較

您也會看到一個名為供應商的資料夾已新增到您的目錄中,它包含我們的 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
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

我們之所以要創建這兩個文件,一個包含所有信息,另一個僅包含部分信息,是因為 .env 文件不應該上傳到存儲庫,因為它包含機密信息。假設將來我們要使用第三方 API,需要添加 token 進行訪問,然後我們會將這些資訊儲存在 .env 檔案中。

為了防止 .env 檔案上傳到我們的儲存庫,我們將建立一個名為 .gitignore 的檔案並新增以下資訊:

MYSQL_DATABASE: api_example // <--- Este é nosso banco de dados
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

這樣我們就定義了 .env 檔案和供應商資料夾的全部內容將不會被提交。

至此,我們已經完成了專案配置,可以繼續編碼了。

編纂

我們將建立以下目錄 src/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:
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

我們將建立與檔案同名的類,並建立一個名為 $dbConnection 並傳遞 null 值的私有變數。
該變數將負責此類的新實例並將我們與資料庫連接起來。
稍後當我們實作 try-catch.
時我們會看到更多

image: mysql:9.1.0
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

在建構函式中,我們將建立以下變數並使用 Dotenv 檢查從 .env 檔案捕獲的值。

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:作為我們正在使用的服務/銀行
  • - 主機=$主機; 我們的主人
  • - 埠=$埠; 我們的門<​​🎜>
  • - 字元集=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:
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

我們建立一個名為 $statement 的變量,其值為 Heredoc

image: mysql:9.1.0
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

在此Heredoc中,我們將添加一些查詢

ports:
      - '3306:3306'
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

這裡我選擇刪除表刪除整個基礎,然後開始一個新的,但是如果你願意,你可以刪除這行程式碼。

下面的程式碼行指定該表將用於執行事務,並且表之間將建立連線。如果你想了解更多關於這個mysql聲明:innoDb文檔

environment:
      MYSQL_ROOT_PASSWORD: useroot
      MYSQL_USER: api_user
      MYSQL_PASSWORD: api_password
      MYSQL_DATABASE: api_example
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

在同一個Heredoc中,我們將再增加一個查詢

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
登入後複製

現在只需使用郵遞員或任何其他可以幫助您與網址互動的應用程式。

我的社群網路:
Github Linkedin

以上是如何使用純 PHP 建立 API?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!