【问题标题】:Laravel/Lumen 5.3.3: override env values in migrationsLaravel/Lumen 5.3.3:在迁移中覆盖 env 值
【发布时间】:2017-05-17 23:47:24
【问题描述】:

在 laravel 文档中我生动地看到:

https://laravel.com/docs/5.3/configuration#environment-configuration

您也可以创建一个 .env.testing 文件。此文件将覆盖 运行 PHPUnit 测试或执行时来自 .env 文件的值 带有 --env=testing 选项的 Artisan 命令。

所以我想通过添加 .env.migration 文件并覆盖 mysql 用户凭据,我可以与另一个用户一起运行我的迁移:

php artisan migrate --env=migration

它不仅不会覆盖先前定义的值,甚至不会向环境添加新值!事实上,工匠命令根本不加载文件。我将文件名更改为测试,无济于事。我更新了我的作曲家,仍然没有结果。

我有一个简单的问题。 使用其他数据库凭据处理 laravel 迁移的最佳方法是什么?

如果我知道 lumen 包中的迁移脚本在哪里,也很受欢迎,这样我就可以开始深入研究脚本了。

【问题讨论】:

    标签: php laravel migration environment-variables lumen


    【解决方案1】:

    此问题已在 5.3.11 中通过 this PR 修复。如果您至少升级到该版本,则 artisan 命令将在加载 .env 文件时遵循 --env 设置。

    如果您使用 Lumen,则需要更新您的 bootstrap/app.php 文件。

    文件顶部附近是这段代码:

    try {
        (new Dotenv\Dotenv(__DIR__.'/../'))->load();
    } catch (Dotenv\Exception\InvalidPathException $e) {
        //
    }
    

    这应该替换为如下内容:

    $suffix = '';
    
    if (php_sapi_name() == 'cli') {
        $input = new Symfony\Component\Console\Input\ArgvInput;
    
        if ($input->hasParameterOption('--env')) {
            $suffix = '.'.$input->getParameterOption('--env');
        }
    } elseif (env('APP_ENV')) {
        $suffix = '.'.env('APP_ENV');
    }
    
    $env = '.env';
    if ($suffix && file_exists(__DIR__.'/../'.$env.$suffix)) {
        $env .= $suffix;
    }
    
    try {
        (new Dotenv\Dotenv(__DIR__.'/../', $env))->load();
    } catch (Dotenv\Exception\InvalidPathException $e) {
        //
    }
    

    注意:未经测试,但这个想法应该可行。

    【讨论】:

    • 我想这是对Laravel 的修复。我正在使用Lumen
    • 谢谢@patricus,我会尽快尝试。我会告诉你结果的。
    • 我测试了代码并更新了答案。它工作正常(Y)。如果您想再次更新,请随意:)
    • @HPM 很高兴它为你解决了。编辑是一个有趣的想法,但它与 Laravel 的工作方式背道而驰(这是大多数人所熟悉的)。期望你得到一个 env 文件,对 env 文件没有级联影响。但是,我很高兴您能够以您想要的方式实现它。
    • 我明白你在说什么,但正如我在问题 Laravel 文档中提到的那样, .env.whatever 应该覆盖原始值。顺便说一句,我认为我们仍然需要更新答案,因为在我们加载环境时,这里没有加载环境变量:elseif (env('APP_ENV')) { $suffix = '.'.env('APP_ENV'); } 我们必须删除这部分再次感谢:)
    【解决方案2】:

    这是我用来在运行时更新特定 .env 值的方法(即使配置已缓存)。我将把安全警告放在那里,对这样的方法的调用应该被严格保护,并且用户输入应该被正确地清理。

    private function setEnvironmentValue($environmentName, $configKey, $newValue) {
        file_put_contents(App::environmentFilePath(), str_replace(
            $environmentName . '=' . Config::get($configKey),
            $environmentName . '=' . $newValue,
            file_get_contents(App::environmentFilePath())
        ));
    
        Config::set($configKey, $newValue);
    
        // Reload the cached config       
        if (file_exists(App::getCachedConfigPath())) {
            Artisan::call("config:cache");
        }
    }
    

    它的使用示例是;

    $this->setEnvironmentValue('APP_LOG_LEVEL', 'app.log_level', 'debug');
    

    $environmentName是环境文件中的key(例如..APP_LOG_LEVEL)

    $configKey 是用于在运行时访问配置的密钥(例如 ..app.log_level (tinker config('app.log_level'))。

    $newValue 当然是您希望保留的新值。

    【讨论】:

    • 此代码在加载后开始覆盖 env 和 config 值,但我喜欢使用覆盖的值引导我的应用程序。通常一个简单的环境变量会影响另一个配置变量的构建方式。无法跟踪 env var 如何影响整个应用程序。
    【解决方案3】:

    试试这个:

    try {
        // < L5.8
        // (\Dotenv\Dotenv(dirname(__DIR__,1), '.env')->overload();
        // >= L5.8
        ( \Dotenv\Dotenv::createImmutable( dirname(__DIR__,1).'/.env' ) )->load();
    } catch ( \Dotenv\Dotenv\Exception\InvalidPathException $e ) {
        //
    }
    

    read this article.

    dotEnv repo

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 2019-07-26
      • 2020-12-12
      • 2016-08-03
      • 2018-11-10
      • 2015-01-23
      • 2019-05-19
      • 2023-03-30
      • 2016-03-22
      相关资源
      最近更新 更多