Laravel/Lumen 5.3.3:在迁移中覆盖 env 值

Posted

技术标签:

【中文标题】Laravel/Lumen 5.3.3:在迁移中覆盖 env 值【英文标题】:Laravel/Lumen 5.3.3: override env values in migrations 【发布时间】: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 包中的迁移脚本在哪里,也很受欢迎,这样我就可以开始深入研究脚本了。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Laravel/Lumen 5.3.3:在迁移中覆盖 env 值的主要内容,如果未能解决你的问题,请参考以下文章

未定义的方法 Laravel\Lumen\Application::booted()

Lumen:在 routes.php 第 17 行:升级到 5.5 后调用未定义的方法 Laravel\Lumen\Application::post()。*

Lumen 5.4 与 Laravel 可邮寄

如何在 Lumen 6x 中实现默认 Laravel 重置密码

Laravel / Lumen 只读模型?

如何在 Laravel/Lumen 中捕获 401 响应?