Laravel 5.1未使用正确的.env值

Laravel 5.1未使用正确的.env值,laravel,laravel-5,phpdotenv,Laravel,Laravel 5,Phpdotenv,我使用的是Laravel 5.1.44,尽管我有一个带有不同值的.env.testing文件设置,以及App::environment()返回'testing',但Laravel似乎仍然只使用主.env文件中的值 还有什么我应该仔细检查以确保我没有搞砸或忘记设置的吗?使用特定于环境的.env文件(例如.env.testing)的功能直到Laravel 5.2.13才可用。即使如此,它也只能在不使用配置缓存的情况下工作 最简单的选择是将所有特定于测试的环境变量添加到phpunit.xml文件中。正

我使用的是Laravel 5.1.44,尽管我有一个带有不同值的
.env.testing
文件设置,以及
App::environment()
返回
'testing'
,但Laravel似乎仍然只使用主
.env
文件中的值


还有什么我应该仔细检查以确保我没有搞砸或忘记设置的吗?

使用特定于环境的
.env
文件(例如
.env.testing
)的功能直到Laravel 5.2.13才可用。即使如此,它也只能在不使用配置缓存的情况下工作

最简单的选择是将所有特定于测试的环境变量添加到
phpunit.xml
文件中。正如你所提到的,你已经有一些在那里,它应该没有问题,以增加任何额外的你需要的

如果您确实希望在Laravel 5.1中使用特定于环境的
.env
文件功能,可以尝试以下方法。注意,这是未经测试的,只是基于查看源代码的假设

.env
文件加载到名为
DetectEnvironment
的引导类中。其思想是您创建自己的引导类,该类修改将加载的
DetectEnvironment
文件的
.env
文件名,然后更新
内核
文件,以便调用新的引导类,并在
DetectEnvironment
bootstrapper

因此,首先,创建一个新的引导程序类(例如,
app\Bootstrap\CustomEnvironment.php
):

将以下属性添加到
app/Http/Kernel.php
文件中:

/**
 * The bootstrap classes for the application.
 *
 * @var array
 */
protected $bootstrappers = [
    'App\Bootstrap\CustomEnvironment',
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    'Illuminate\Foundation\Bootstrap\LoadConfiguration',
    'Illuminate\Foundation\Bootstrap\ConfigureLogging',
    'Illuminate\Foundation\Bootstrap\HandleExceptions',
    'Illuminate\Foundation\Bootstrap\RegisterFacades',
    'Illuminate\Foundation\Bootstrap\SetRequestForConsole',
    'Illuminate\Foundation\Bootstrap\RegisterProviders',
    'Illuminate\Foundation\Bootstrap\BootProviders',
];
/**
 * The bootstrap classes for the application.
 *
 * @var array
 */
protected $bootstrappers = [
    'App\Bootstrap\CustomEnvironment',
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    'Illuminate\Foundation\Bootstrap\LoadConfiguration',
    'Illuminate\Foundation\Bootstrap\ConfigureLogging',
    'Illuminate\Foundation\Bootstrap\HandleExceptions',
    'Illuminate\Foundation\Bootstrap\RegisterFacades',
    'Illuminate\Foundation\Bootstrap\RegisterProviders',
    'Illuminate\Foundation\Bootstrap\BootProviders',
];
注意,乍一看它们可能很相似,但是
控制台
Http
内核之间的引导程序不同(
控制台
还有一个引导程序)。不要只是复制上面的一个文件并将其添加到两个文件中

编辑 另一种更简单的方法是为
DetectEnvironment
bootstrapper设置一个before侦听器,并将文件设置为在事件关闭时加载

因此,例如,在您的
bootstrap\app.php
文件中,在
return$app之前添加以下代码语句:

$app->beforeBootstrapping(
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    function($app) {
        // APP_ENV must already be set.
        // We must know which environment file to look for.
        if (! env('APP_ENV')) {
            return;
        }

        // Build the file name to look for (e.g. .env.testing)
        $file = $app->environmentFile().'.'.env('APP_ENV');

        // If the file exists, set the App to load from that file.
        // The actual loading will take place in DetectEnvironment
        if (file_exists($app->environmentPath().'/'.$file)) {
            $app->loadEnvironmentFrom($file);
        }
    }
);

使用
beforeBootstrapping()
方法,第二个参数中的闭包将在调用第一个参数中的引导程序之前立即执行。现在您不必担心内核或额外的类或任何东西。

使用特定于环境的
.env
文件(例如
.env.testing
)的功能直到Laravel 5.2.13才可用。即使如此,它也只能在不使用配置缓存的情况下工作

最简单的选择是将所有特定于测试的环境变量添加到
phpunit.xml
文件中。正如你所提到的,你已经有一些在那里,它应该没有问题,以增加任何额外的你需要的

如果您确实希望在Laravel 5.1中使用特定于环境的
.env
文件功能,可以尝试以下方法。注意,这是未经测试的,只是基于查看源代码的假设

.env
文件加载到名为
DetectEnvironment
的引导类中。其思想是您创建自己的引导类,该类修改将加载的
DetectEnvironment
文件的
.env
文件名,然后更新
内核
文件,以便调用新的引导类,并在
DetectEnvironment
bootstrapper

因此,首先,创建一个新的引导程序类(例如,
app\Bootstrap\CustomEnvironment.php
):

将以下属性添加到
app/Http/Kernel.php
文件中:

/**
 * The bootstrap classes for the application.
 *
 * @var array
 */
protected $bootstrappers = [
    'App\Bootstrap\CustomEnvironment',
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    'Illuminate\Foundation\Bootstrap\LoadConfiguration',
    'Illuminate\Foundation\Bootstrap\ConfigureLogging',
    'Illuminate\Foundation\Bootstrap\HandleExceptions',
    'Illuminate\Foundation\Bootstrap\RegisterFacades',
    'Illuminate\Foundation\Bootstrap\SetRequestForConsole',
    'Illuminate\Foundation\Bootstrap\RegisterProviders',
    'Illuminate\Foundation\Bootstrap\BootProviders',
];
/**
 * The bootstrap classes for the application.
 *
 * @var array
 */
protected $bootstrappers = [
    'App\Bootstrap\CustomEnvironment',
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    'Illuminate\Foundation\Bootstrap\LoadConfiguration',
    'Illuminate\Foundation\Bootstrap\ConfigureLogging',
    'Illuminate\Foundation\Bootstrap\HandleExceptions',
    'Illuminate\Foundation\Bootstrap\RegisterFacades',
    'Illuminate\Foundation\Bootstrap\RegisterProviders',
    'Illuminate\Foundation\Bootstrap\BootProviders',
];
注意,乍一看它们可能很相似,但是
控制台
Http
内核之间的引导程序不同(
控制台
还有一个引导程序)。不要只是复制上面的一个文件并将其添加到两个文件中

编辑 另一种更简单的方法是为
DetectEnvironment
bootstrapper设置一个before侦听器,并将文件设置为在事件关闭时加载

因此,例如,在您的
bootstrap\app.php
文件中,在
return$app之前添加以下代码语句:

$app->beforeBootstrapping(
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    function($app) {
        // APP_ENV must already be set.
        // We must know which environment file to look for.
        if (! env('APP_ENV')) {
            return;
        }

        // Build the file name to look for (e.g. .env.testing)
        $file = $app->environmentFile().'.'.env('APP_ENV');

        // If the file exists, set the App to load from that file.
        // The actual loading will take place in DetectEnvironment
        if (file_exists($app->environmentPath().'/'.$file)) {
            $app->loadEnvironmentFrom($file);
        }
    }
);

使用
beforeBootstrapping()
方法,第二个参数中的闭包将在调用第一个参数中的引导程序之前立即执行。现在您不必担心内核或额外的类或任何东西。

您可能需要在phpunit.xml中注册它。它似乎已经设置好了:
php
我很确定您只能拥有一个.env文件。您可以使用config目录中的config文件为每个环境定义多个配置,然后您可以通过.env或PHPUnit文件设置env。是的,我也看到了,在这个示例中,他们使用
.env.testing
文件为
测试
环境定义值。我的问题是,当我的环境进行
测试时
,它不会从
.env.testing
读取值,只读取
.env
。根据Laravel正在使用的“dotenv”库中的文档,它应该非常简单,只需为该环境创建另一个文件名格式为
.env.{{{environmentName}}的点文件即可
您可能需要在phpunit.xml中注册它。它似乎已经设置好了:
php
我很确定您只能拥有一个.env文件。你可以使用config目录中的config文件为每个环境定义多个配置,然后你可以通过.env或PHPUnit文件设置env看看,是的,我也看到了,在这个示例中,他们使用了
.env.testi