如何验证 Laravel 应用程序的配置
发布时间 作者 Ashley Allen
随着您的 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 提供的 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
字段创建一个新的验证规则。我们将定义一个规则,该规则指出该字段必须是以下之一: smtp
、 sendmail
、 mailgun
、 ses
或 postmark
。为此,我们可以编写以下规则
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.php
和config/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
环境中自动运行每个请求的配置验证,并在production
或testing
中运行时忽略它
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 仓库中查看。
如果你喜欢阅读这篇文章,我很乐意听到你的意见。同样,如果你有任何反馈以改进未来的文章,我也很乐意听到。
继续构建很棒的东西!🚀