在這個專案中,我們將在任何框架中僅使用 PHP 建立一個簡單的 API。我們所需要的只是:
讓我們先為資料庫配置定義 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
建立這兩個檔案後,我們可以發出指令
ports: - '3306:3306'
它將安裝 Dotenv 函式庫並配置所需 PSR 的設定。
執行此命令後,將在我們的環境中建立composer.lock.
對於來自 JavaScript 世界的人來說,這些檔案可以與 package.json 和 package-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 模組,它接收參數
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中文網其他相關文章!