如何使用纯 PHP 创建 API?

Patricia Arquette
发布: 2024-11-04 06:11:01
原创
919 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板