如何验证 Laravel 应用程序的配置

发布时间 作者

How to Validate Your Laravel App's Config image

随着您的 Laravel 项目的改变和发展,您很可能会添加新的配置字段并让新的团队成员与您一起工作。尤其是对于初级开发者来说,第一次为每个项目在本地开发机器上设置配置和环境变量有时(但并非总是)会非常令人困惑。

您有时会发现自己在挠头想:“ *我在这里放了正确的 API 密钥吗?* ”,或者“ *这是此环境变量的正确 URL 吗?* ”,以及“ *此配置字段可以有哪些不同的值?* ”。

当然,这些类型的问题可以通过编写良好且最新的文档来避免。但是,如果这些问题可以在运行应用程序之前通过编程方式解决并执行,而不是通过肉眼或等到代码在运行时失败,岂不是更好吗?

什么是 Laravel Config Validator?

Laravel Config Validator 是我构建的一个软件包,旨在通过提供开发人员可以用来验证配置字段的规则来解决这些问题。它允许您使用 Artisan 命令来验证配置字段,以便您和其他开发人员可以确保他们设置了正确的配置。

使用此软件包的主要好处是它鼓励将代码作为文档,因为您可以每次更改配置时更新配置验证规则,而不是更新项目文档中一个无聊的降价文件,该文件可能隐藏起来并且从未被查看。

它还允许您相对轻松地编写复杂的规则。例如,假设您有一个配置字段用于存储您的 Mailgun API 密钥。您可以编写一个简单的规则来确保该密钥存在并且是一个字符串。但是,您可以更进一步,编写一个规则,该规则会向 API 发出 HTTP 请求以确认这些密钥实际上是有效的,并且可以使用这些密钥在您的应用程序中发出请求。

为了更好地了解这在您的代码库中可能是什么样子,这里有一个基本的示例,说明我们如何验证 services.mailchimp.api_key 字段。

use AshAllenDesign\ConfigValidator\Services\Rule;
use App\Rules\ValidMailchimpKey;
 
return [
Rule::make('mailchimp.api_key')
->rules(['required', 'string', new ValidMailchimpKey()]),
];

在定义了如上所示的规则之后,我们就可以运行该软件包提供的命令( php artisan config:validate )。如果 services.mailchimp.api_key 字段有效,则验证将通过。否则,该命令将返回错误列表,以便我们可以发现不正确的配置值,类似于下面此示例屏幕截图中的错误列表。

Laravel config validator failure output

我认为该软件包最好的部分是您不需要学习任何新语法!在幕后,该软件包使用 Laravel 提供的 Validator。因此,您可以使用与在请求验证中通常使用的相同的规则。

现在,让我们看看如何安装该软件包并开始在您自己的项目中使用它。

安装软件包

要开始使用该软件包,您需要确保您的 Laravel 项目使用的是至少 Laravel 8.0 和 PHP 8.0。

您可以使用以下命令通过 Composer 安装该软件包

composer require ashallendesign/laravel-config-validator

该软件包附带了一些方便的规则集,您可以使用它们来验证一些默认的 Laravel 配置字段。这些是完全可选的,但它们可以为验证您的应用程序的配置提供一个良好的起点。如果您想使用默认规则集,可以使用以下命令发布它们

php artisan vendor:publish --tag=config-validator-defaults

上面的命令将复制验证文件并将其放置在项目根目录中的 config-validation 文件夹中。这些规则只是为了让您入门,因此很可能有些规则对您的项目来说是不需要的。因此,发布它们后,您可以随意删除或编辑它们。

定义配置验证规则集

现在我们已经安装了软件包,我们可以开始创建我们自己的规则集了。

使用该软件包提供的命令来创建新的规则集非常简单。例如,如果我们想为验证 config/app.php 文件中的配置创建一个规则集,我们可以运行以下命令

php artisan make:config-validation app

运行上面的命令将在 config-validation/app.php 中创建一个文件,您可以开始添加您的配置验证。

重要的是要记住,您的配置验证文件的名称需要与您要验证的配置文件相匹配。例如,如果您想验证 config/mail.php 文件,您的验证文件需要存储为 config-validation/mail.php

向规则集添加规则

config-validation 目录中创建规则集文件后,我们可以开始添加验证规则了。

在幕后,该软件包使用与 Laravel 一起提供的内置 Validator 类,并利用所有现有的 Laravel 中可用的验证规则,因此使用它应该看起来很熟悉。

让我们举一个简单的例子,并为 app/mail.php 文件中的 driver 字段创建一个新的验证规则。我们将定义一个规则,该规则指出该字段必须是以下之一: smtpsendmailmailgunsespostmark。为此,我们可以编写以下规则

use AshAllenDesign\ConfigValidator\Services\Rule;
 
return [
 
// ...
 
Rule::make('driver')->rules(['in:smtp,sendmail,mailgun,ses,postmark']),
 
// ...
 
];

如您所见,定义规则非常简单!

自定义验证错误消息

有时您可能希望覆盖特定验证规则的默认错误消息。这可以通过在定义规则集时使用 Rule 对象上的 messages 方法来轻松实现。

例如,如果我们想覆盖我们创建的 mail.driver 配置验证规则的错误消息,我们可以这样做

use AshAllenDesign\ConfigValidator\Services\Rule;
 
return [
 
// ...
 
Rule::make('driver')
->rules(['in:smtp,sendmail,mailgun,ses,postmark'])
->messages(['in' => 'Our custom error message here']),
 
// ...
 
];

仅在特定应用程序环境中运行

您可能希望创建一些仅应在特定环境中运行的规则。例如,您可能希望为本地开发环境创建一组宽松的验证规则,并为生产环境创建一组更严格的规则。

要指定规则可以在哪个环境中运行,可以使用 Rule 对象上提供的 environments 方法。如果未定义环境,则该规则默认将在所有环境中运行。

例如,假设我们在本地工作时,我们并不关心使用哪个邮件驱动程序。但是,在生产环境中,我们希望确保我们只使用 mailgun。因此,我们可以创建一个宽松的规则在本地运行,以及一个严格的规则在生产环境中运行,如下所示

use AshAllenDesign\ConfigValidator\Services\Rule;
 
return [
Rule::make('driver')
->rules(['in:smtp,sendmail,mailgun,ses,postmark'])
->environments([Rule::ENV_LOCAL]),
 
Rule::make('driver')
->rules(['in:mailgun'])
->environments([Rule::ENV_PRODUCTION]),
];

运行配置验证

现在我们已经了解了如何定义我们自己的配置验证规则集,让我们来看看如何实际运行验证。

使用命令

运行配置验证最常见(也是最简单)的方法是使用该软件包附带的 Artisan 命令。

您可以通过运行以下命令来使用它

php artisan config:validate

但是,您可能并不总是希望验证应用程序中的所有配置值。因此,该命令允许您指定要验证的确切配置文件。为此,可以使用 --files 选项。

例如,如果我们只希望验证 config/auth.php 文件,我们可以运行以下命令

php artisan config:validate --files=auth

同样地,如果想要显式定义多个文件同时进行验证,可以将多个文件名以逗号隔开传递给--files选项。例如,要验证config/auth.phpconfig/services.php文件,可以运行以下命令

php artisan config:validate --files=auth,services

手动运行验证

有时你可能更愿意在代码中手动运行验证命令,而不是使用提供的命令。为此,你可以简单地调用AshAllenDesign\ConfigValidator\Services\ConfigValidator类的run方法,如下所示

use AshAllenDesign\ConfigValidator\Services\ConfigValidator;
 
(new ConfigValidator())->run();

默认情况下,如果所有验证检查都通过,run方法将返回true。如果任何检查失败,将抛出AshAllenDesign\ConfigValidator\Exceptions\InvalidConfigValueException异常。

与使用命令定义要运行的特定验证规则集类似,我们也可以在ConfigValidator对象中执行相同的操作。为此,可以将配置文件名数组传递给run方法。

例如,如果我们只想为config/auth.php文件运行验证,可以使用以下代码

use AshAllenDesign\ConfigValidator\Services\ConfigValidator;
 
(new ConfigValidator())->run(['auth']);

在服务提供者中运行

一个很好的例子是,你可能希望在服务提供者中手动运行你的配置验证。这是在开发时在本地环境中运行配置验证规则的理想位置,以确保你拥有所有有效的配置值。如果你经常在包含不同字段(具有不同的必需配置字段)的 Git 分支之间切换,这一点尤其有用。

以下是如何在我们的local环境中自动运行每个请求的配置验证,并在productiontesting中运行时忽略它

namespace App\Providers;
 
use AshAllenDesign\ConfigValidator\Services\ConfigValidator;
use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
if (App::environment() === 'local') {
(new ConfigValidator())->run();
}
}
}

抛出和阻止异常

如上所述,默认情况下,如果验证失败,ConfigValidator类将抛出AshAllenDesign\ConfigValidator\Exceptions\InvalidConfigValueException异常。该异常将包含第一个验证失败的配置值的错误消息。

但是,有时你可能不希望在第一次失败时抛出异常,而是希望一次运行所有规则。为此,可以使用throwExceptionOnFailure方法阻止异常被抛出,而是依赖run方法的布尔返回值。如果我们禁用抛出异常,如果任何验证检查失败,run方法将返回false

通过阻止任何异常被抛出,我们就可以使用errors方法获取失败的验证错误,该方法将以数组形式返回它们。

以下示例展示了如何阻止任何异常被抛出,以便你可以获取错误

$configValidator = new ConfigValidator();
 
$errors = $configValidator->throwExceptionOnFailure(false)
->run()
->errors();

这实际上是该软件包的命令如何运行验证器,以便它可以一次在输出中显示所有失败。

结论

希望这篇文章能让你了解如何在 Laravel 应用中使用 Laravel Config Validator 包来验证你的应用的配置值。如果你有兴趣查看该软件包的代码,可以在GitHub 仓库中查看。

如果你喜欢阅读这篇文章,我很乐意听到你的意见。同样,如果你有任何反馈以改进未来的文章,我也很乐意听到。

继续构建很棒的东西!🚀

Ashley Allen photo

我是一名自由职业的 Laravel 网站开发人员,喜欢为开源项目做贡献,构建激动人心的系统,并帮助他人学习 Web 开发。

归档于
Cube

Laravel 新闻

加入 40,000 多名其他开发人员,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成功能和本地和生产环境中的即时反馈进行微调。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发人员,现在可以为您的 Laravel 项目雇用。⬧ 每月 7500 美元的固定价格。⬧ 没有冗长的销售流程。⬧ 没有合同。⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel 吗?即时、自动化的 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

只需每月 2500 美元,就可以让经验丰富的 Laravel 开发人员(4-6 年经验)为您的项目增光添彩。获得 160 小时的专用专业知识和 15 天的无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - Laravel 开发的理想选择,拥有超过 10 年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,为 Laravel 带来了现代无头电子商务功能的力量。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账、管理面板、用户仪表盘、身份验证、现成组件、统计、博客、文档等等。

SaaSykit: Laravel SaaS 启动工具包
Rector logo

Rector

您无缝 Laravel 升级的合作伙伴,降低成本,加速创新,为成功企业提供服务

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活的现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包在您的 Laravel 应用程序中添加评论

阅读文章