創建 REST API 的 PHP 項目骨架

首先,我們需要為項目創建基本的文件結構。在項目根目錄下創建一個 /src 目錄,并添加一個簡單的 composer.json 文件。我們將使用 DotEnv 庫來管理環境變量,例如 Okta 的身份驗證信息。

配置自動加載器

composer.json 文件中配置 PSR-4 自動加載器,以便自動加載 /src 目錄中的 PHP 類。完成后,運行以下命令安裝依賴項:

composer install

安裝完成后,項目中會生成一個 /vendor 目錄,并安裝 DotEnv 依賴項。接下來,為項目創建一個 .gitignore 文件,確保 /vendor 目錄和 .env 文件不會被提交到代碼倉庫。

配置環境變量

創建一個 .env.example 文件,用于存儲 Okta 身份驗證所需的變量模板。同時,創建一個 .env 文件,用于存儲實際的 Okta 憑據信息。為了加載這些環境變量,我們需要創建一個 bootstrap.php 文件:

require_once __DIR__ . '/../vendor/autoload.php';

$dotenv = DotenvDotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();

配置數據庫

我們將使用 MySQL 作為 API 的數據庫。首先,為應用程序創建一個新的數據庫和用戶。接著,創建一個名為 Person 的表,用于存儲用戶信息。表結構如下:

以下是創建表的 SQL 語句:

CREATE TABLE Person (
 id INT AUTO_INCREMENT PRIMARY KEY,
 firstname VARCHAR(255) NOT NULL,
 lastname VARCHAR(255) NOT NULL,
 firstparent_id INT DEFAULT NULL,
 secondparent_id INT DEFAULT NULL
);

將數據庫連接信息添加到 .env.example 文件中,并在 .env 文件中填寫實際的數據庫憑據。

數據庫連接類

創建一個 PHP 類用于管理數據庫連接,并在 bootstrap.php 文件中初始化連接:

class Database {
 private $connection;

 public function __construct() {
 $this->connection = new PDO(
 'mysql:host=' . $_ENV['DB_HOST'] . ';dbname=' . $_ENV['DB_NAME'],
 $_ENV['DB_USER'],
 $_ENV['DB_PASSWORD']
 );
 }

 public function getConnection() {
 return $this->connection;
 }
}

為 Person 表添加網關類

在面向對象編程中,有多種方式與數據庫交互。對于簡單的 API,我們可以使用表網關模式。創建一個 PersonGateway 類,包含以下方法:

以下是 PersonGateway 類的示例代碼:

class PersonGateway {
 private $db;

 public function __construct($db) {
 $this->db = $db;
 }

 public function getAll() {
 $stmt = $this->db->query("SELECT * FROM Person");
 return $stmt->fetchAll(PDO::FETCH_ASSOC);
 }

 public function getById($id) {
 $stmt = $this->db->prepare("SELECT * FROM Person WHERE id = :id");
 $stmt->execute(['id' => $id]);
 return $stmt->fetch(PDO::FETCH_ASSOC);
 }

 public function create($data) {
 $stmt = $this->db->prepare("INSERT INTO Person (firstname, lastname) VALUES (:firstname, :lastname)");
 $stmt->execute($data);
 }

 public function update($id, $data) {
 $stmt = $this->db->prepare("UPDATE Person SET firstname = :firstname, lastname = :lastname WHERE id = :id");
 $stmt->execute(array_merge($data, ['id' => $id]));
 }

 public function delete($id) {
 $stmt = $this->db->prepare("DELETE FROM Person WHERE id = :id");
 $stmt->execute(['id' => $id]);
 }
}

實現 PHP REST API

我們將創建以下 REST API 端點

在項目的 /public 目錄下創建一個 index.php 文件作為前端控制器,并在 src/controller 目錄下創建 PersonController.php 來處理具體的 API 請求。


使用 OAuth 2.0 保護 API

為了保護 API,我們將使用 Okta 作為授權服務器,并實現客戶端憑據流。以下是身份驗證的基本流程:

  1. 客戶端應用程序持有客戶端 ID 和密鑰。
  2. 客戶端將憑據傳遞給 Okta,獲取訪問令牌。
  3. 客戶端使用訪問令牌向 API 服務器發送請求。
  4. API 服務器驗證令牌的有效性,并根據結果提供資源或返回 401 錯誤。

配置 Okta

使用 Okta CLI 創建 OAuth 2.0 服務應用程序,并將生成的憑據添加到 .env 文件中。確保在 Okta 管理控制臺中為 API 添加所需的作用域。


構建測試客戶端應用程序

為了測試 API,我們將創建一個簡單的命令行客戶端應用程序。該客戶端將從 .env 文件中讀取 Okta 的詳細信息,獲取訪問令牌,并調用 API 端點。

以下是測試客戶端的示例代碼:

$token = getAccessToken();
$response = callApi('/persons', $token);

function getAccessToken() {
 // 使用 Okta 憑據獲取訪問令牌
}

function callApi($endpoint, $token) {
 // 使用 cURL 調用 API
}

運行客戶端腳本即可測試 API 的功能。


總結

通過本文的步驟,我們從零開始構建了一個簡單的 PHP REST API,并使用 Okta 實現了安全性。完整的代碼可以在 GitHub 示例倉庫 中找到。如果您想深入了解相關技術,可以參考以下資源:

原文鏈接: https://developer.okta.com/blog/2019/03/08/simple-rest-api-php

上一篇:

五大PHP REST API框架

下一篇:

使用C語言創建REST API的完整指南
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費