如何使用纯 PHP 创建 API?
在这个项目中,我们将在任何框架中仅使用 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
接下来我定义将使用哪个图像来创建我们的数据库,对于这个项目,我使用 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 模块,它接收参数
- 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

RESTAPI设计原则包括资源定义、URI设计、HTTP方法使用、状态码使用、版本控制和HATEOAS。1.资源应使用名词表示并保持层次结构。2.HTTP方法应符合其语义,如GET用于获取资源。3.状态码应正确使用,如404表示资源不存在。4.版本控制可通过URI或头部实现。5.HATEOAS通过响应中的链接引导客户端操作。

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

匿名类在PHP中的主要作用是创建一次性使用的对象。1.匿名类允许在代码中直接定义没有名字的类,适用于临时需求。2.它们可以继承类或实现接口,增加灵活性。3.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。
