its-mieger/lara-env-guard

实现laravel应用的检查,以确保测试不在不希望的环境中运行

1.1.0 2019-06-25 21:38 UTC

This package is auto-updated.

Last update: 2024-09-15 20:10:24 UTC


README

此包有助于防止代码在不希望的环境中执行。任何因为单元测试在错误的环境设置下运行而无意中破坏生产数据库的人都知道这是多么容易发生...

基本上,此包提供了三种保护机制,您可以很容易地通过包含一个单独的特质将其添加到您的代码中

  • 检查应用程序环境(APP_ENV)是否正确
  • 检查是否加载了具有单独.env文件的独立应用程序环境
  • 将数据库主机与模式白名单进行比对

用法

只需添加ProtectsEnvironment特质并调用相应的检查函数。如果您的环境配置不符合预期,这些函数将抛出RuntimeException。对于测试,CreatesApplication特质是放置检查函数的完美位置。请参见以下示例

trait CreatesApplication {

	use ProtectsEnvironment;

    public function createApplication() {
        $app = require __DIR__.'/../bootstrap/app.php';
        $app->make(Kernel::class)->bootstrap();
        
        // do environment checks
        $this->checkEnvironmentAllowed();
        $this->checkEnvironmentConfigured();
        $this->checkDatabaseHostWhitelisted();
        
        
        return $app;
    }
}

检查允许的环境

《code>checkEnvironmentAllowed方法检查当前环境是否匹配预期环境之一。

如果没有提供任何参数,则仅允许“testing”环境。

当然,您可以指定一个自定义的允许环境列表。您可以通过设置实例的allowedEnvironments属性或通过将允许的环境作为第二个参数传递来实现。

$this->checkEnvironmentAllowed('tests', ['testing', 'dusk']);

由于您可能无法在代码中列出所有环境,您还可以通过在.env文件中设置一个特定变量来允许当前环境。该变量的名称必须与函数调用的第一个参数匹配。这是target参数,默认为"tests"。因此,对于“tests”目标,将以下行添加到您的.env文件以允许其在测试环境中使用

ENV_ALLOWED_FOR_TESTS=true

检查是否加载了独立的配置文件

《code>checkEnvironmentConfigured方法检查特定于当前环境的.env文件是否存在并且是活动的。

如果没有提供任何参数,则仅可以使用默认的.env文件运行“production”环境。测试和其他环境必须加载它们相应的配置文件,例如.env.testing

当然,您可以指定一个其他环境列表,对于这些环境,此检查应被绕过。您可以通过设置实例的allowedEnvironmentsWithoutSpecialConfiguration属性或通过将允许的环境作为第二个参数传递来实现。

$this->checkEnvironmentConfigured('tests', ['staging']);

您还可以通过在该文件中设置一个特定变量来允许使用特定的配置文件。该变量的名称必须与函数调用的第一个参数匹配。这是target参数,默认为"tests"。因此,对于“tests”目标,将以下行添加到您的.env文件以允许其在测试环境中使用

ENV_WHITELIST_FOR_TESTS=testing

您可以通过|分隔符指定多个环境

ENV_WHITELIST_FOR_TESTS=testing|dusk

检查数据库主机白名单

在运行测试时始终检查您是否面对测试数据库是一个好主意!您可以这样做,通过调用checkDatabaseHostWhitelisted

数据库主机从应用程序配置中读取,并与白名单中的模式进行校验。如果主机名包含白名单中的至少一个模式,则校验通过。默认模式为 "-dev""-development""-testing"。(包括前缀 "-")。这些模式是简单的字符串,需要包含在内,不是正则表达式或类似的东西。

如果没有提供任何参数调用,则只检查默认连接。

当然,您也可以传递其他连接名称。 null 总是代表默认连接,因此要检查默认连接和名为 "my-connection" 的自定义连接,请调用

$this->checkDatabaseHostWhitelisted([null, 'my-connection']);

如果您想使用自定义模式列表,可以设置实例的 databaseHostWhitelistPatterns 属性或将模式作为第三个参数传递

$this->checkDatabaseHostWhitelisted(null, 'tests', ['127.0.0.1', 'localhost']);

在这里,您也可以使用环境变量在您的配置中指定白名单

DB_WHITELIST_PATTERN_FOR_TESTS=127.0.0.1|localhost|test-db

变量名必须以函数调用中给出的目标名称后缀。参见上面的校验以了解更多关于目标参数的信息。